koda/koda

Utility classes for analyse code and invoking callables with verification of arguments and type casting

2.0.2 2017-09-20 21:25 UTC

This package is auto-updated.

Last update: 2024-04-29 03:29:38 UTC


README

Build Status Coverage Status

Koda allows to analyse code entries, call functions, methods and objects with validation of arguments and type casting. This is similar to call_user_func and call_user_func_array, but more smarter. For example calculate hypotenuse using method:

class Math {
	/**
	 * @param float $leg1 (unsigned) first cathetus of triangle
	 * @param float $leg2 (unsigned) second cathetus of triangle
	 * @return float
	 */
    public static function hypotenuse($leg1, $leg2, $round = 2) {
        // ...
    }
}

all arguments we gets from associative (or plain) array (e.g. $_GET).

If use classic way with call_user_func:

if(isset($_GET['leg1'])) {
    $leg1 = floatval($_GET['leg1']);
    if($leg1 < 0) {
        throw new LogicException("leg1 should be greater than 0");
    }
} else {
    throw new RuntimeException("No leg1 parameter");
}
if(isset($_GET['leg2'])) {
    $leg2 = floatval($_GET['leg2']);
    if($leg2 < 0) {
        throw new LogicException("leg2 should be greater than 0");
    }
} else {
    throw new RuntimeException("No leg2 parameter");
}

return call_user_func('Math::hypotenuse', $leg1, $leg2);

But if use Koda we get one line of code:

return Koda::call('Math::hypotenuse', $_GET);

Koda find all arguments from associative (or plain) array $_GET, change type, validate and invoke method.

Method call

/**
 * Method description
 * @param int $arg1 some integer value
 * @param string $arg2 some string value
 * @param float[] $arg3 array of floating point values
 * @return bool method result
 **/
public function doSomething($arg1, $arg2, array $arg3 = array()) {
    // ...
}

Перед вызовом метода система проверит на наличие всех аргументов в запросе и приведет к нужному типу, согласно описанию метода. Бывает недостаточно простого приведения типа, может потребоваться привинтивная проверка самих данных. В этом случае в системе есть набор готовых проверок. Все проверки указываются так же в doc-блоке в скобках, через запятую сразу после названия аргумента:

/**
 * Method description
 * @param int $arg1 (value 0..100) некий числовой аргумент, значения которого находится между 0 и 100 включительно
 * @param string $arg2 (keyword, length < 100) некий стоковый аргумент, длина которого меньше 100 символов и состоит из `a-z0-9-_`
 * @param float[] $arg3 (count 0..10) массив чисел с плавующей точкой, массив может содержать от 0 до 10 элементов
 **/
public function doSomethingAction($arg1, $arg2, array $arg3) {
    // ...
}

List of verifications (class Koda\Filter):

  • unsigned - value is unsigned integer
  • positive - integer value greater than zero
  • negative - integer value less than zero
  • smalltext - string value less than or equal to 256 bytes
  • text - string value less than or equal to 64KiB.
  • largetext - string value less than or equal to 2MiB.
  • date [FORMAT] - string value is a date. FORMAT - the format that the passed in string should be in. FORMAT - optional parameter, by default function strtotime parse string.
  • length RANGE - specifies the maximum number of bytes allowed in the string value. Maybe range length 1..6, equality length = 6 or inequality length <=100.
  • value RANGE - числовое значение имеет ограничения по значению. Интервал задается промежуток значений 1..6 так и не равеством <=100. Например, value <100, value 6..20
  • count RANGE - массив занчений имеет ограничения по количеству элеменотов. Интервал задается промежуток значений 1..6 так и не равеством <=100. Например, count <100, count 6..20
  • file - checks that the given string is existing regular file.
  • dir - checks that the given string is existing directory.
  • email [extended] - string value is email address. Set parameter extended that would allow the email format James Bond <agent007@dev.null>.
  • domain - checks that the given string is domain.
  • custom CALLBACK - значение будет передано в указанную функцию для проверки
  • url - string value is URL
  • ip - string value is IP address
  • hex - hex string, like md5 or sha1.
  • like PATTERN - match string value against a glob pattern. Example: like *.tgz
  • mask PATTERN - строковое значение удовлетворяет маске символов. Например, mask a-z0-9_
  • regexp PATTERN - строковое значение удовлетворяет регулярному выражению. Например, regexp /^[a-z0-9_]+$/si
  • variants SOURCE - значение является одним из вариантом из списка SOURCE. SOURCE может быть как обычным перечислением через пробел возможных значений параметра так и коллбеком, который возвращает массив допустимых параметров. Например, variants: one two three four
  • options CALLBACK - ассоциативный массив возможных значений. Необходимое значение ищется в ключе массива.
  • is [SOMETHING] - более метка чем проверка, сама проверка ничего не делает и всегда возвращает true. Однако значение можно использовать для правильной отрисовки контрола.

Если указанная проверка не существует в Koda\Filter то для валидации аргумента будет вызван метод текущего контроллера с суффиксом Validator.

/**
 * Method description
 * @param int $author (user active)
 **/
public function addPost($author) {
    // ...
}

public function userValidator($user_id, $type) {
    // check $user_id
}

Система так же воспринимает закачиваемые файлы, в этом случае тип аргумента должен быть splFileInfo:

/**
 * Описание метода
 * @param splFileInfo $file файлы, которые будут закачины на сервер
 **/
public function doSomethingAction(splFileInfo $file) {
    // ...
}

Create object

Cache

RPC example