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 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 integerpositive
- integer value greater than zeronegative
- integer value less than zerosmalltext
- string value less than or equal to 256 bytestext
- 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 rangelength 1..6
, equalitylength = 6
or inequalitylength <=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 parameterextended
that would allow the email formatJames Bond <agent007@dev.null>
.domain
- checks that the given string is domain.custom CALLBACK
- значение будет передано в указанную функцию для проверкиurl
- string value is URLip
- string value is IP addresshex
- 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) {
// ...
}