Комментарии 25
Забавно в нём только использование плюшек PHP5. Как таковой код ооочень врядли кто-то будет брать в проект — риск потратить время и силы на внедрение непонятного велик. А так — у каждого в загашнике есть свой валидатор — вылизанный и известный до последней строки.
+2
не понятно, почему Strain::it($var, 'is_integer') при ошибке должно выводить true, может лучше пусть выводит true если ошибки нет?
+1
Да, довольно непонятно написал. Я уже, если вы заметили, поправил название на 'must_be_integer' чтобы никого не вводить в заблуждение. TRUE — говорит нам о наличии ошибки.
Тут можно поспорить о том, как лучше. Ваш вариант более интуитивный, мой — более логичный, потому что при фильтрации объектов удобнее анализировать Strain::$result конструкцией if, например if($result->name), ведь там может быть и TRUE и строка содержащая информацию об ошибке. В вашем случае нужно будет писать if($result->name !== true).
Это единственная причина такой путаницы.
Если вас это уж совсем смущает, то отредактируйте метод it(), чтобы возвращал наоборот. Там всё предельно просто.
Тут можно поспорить о том, как лучше. Ваш вариант более интуитивный, мой — более логичный, потому что при фильтрации объектов удобнее анализировать Strain::$result конструкцией if, например if($result->name), ведь там может быть и TRUE и строка содержащая информацию об ошибке. В вашем случае нужно будет писать if($result->name !== true).
Это единственная причина такой путаницы.
Если вас это уж совсем смущает, то отредактируйте метод it(), чтобы возвращал наоборот. Там всё предельно просто.
0
Нечто похожее на JS есть и не одно. Например jquery.validate плагин.
Как вашим классом проверить, что a+b < c, a+c < b, b+c < a?
$triangle = array(
'a' => 2,
'b' => 3,
'c' => 5
);
Как вашим классом проверить, что a+b < c, a+c < b, b+c < a?
0
ой… не меньше, а больше… ну не суть важно.
0
Подозреваю, как-то так:
Strain::add('must_be_integer', function(&$value, $options = null) {
if(!is_int($value)) return true;
});
0
Я понял вашу идею, но вы привели слишком плохой «пример». Действительно, такую операцию можно запихнуть в функцию. Поэтому я усложню задачу. Допустим, помимо вашего условия, нам нужно проверить исходные данные (или привести их к integer). Такой алгоритм будет выглядить так:
$value = (object) array(
'a' => 2,
'b' => 3,
'c' => 5
);
Strain::add('must_be', function($value, $options) {
if (Strain::it($value, $options)) return true;
});
Strain::add('triangle', function($value, $options = null) {
if ($value->a+$value->b c || $value->a+$value->c b || $value->b+$value->c a) return true;
});
$valid = array('must_be' => (object) array(
'a' => 'integer',
'b' => 'integer',
'c' => 'integer'
), 'triangle');
var_dump(Strain::it($value, $valid)); // (TRUE — если ошибка, FALSE — если всё ок)
*протестировано
$value = (object) array(
'a' => 2,
'b' => 3,
'c' => 5
);
Strain::add('must_be', function($value, $options) {
if (Strain::it($value, $options)) return true;
});
Strain::add('triangle', function($value, $options = null) {
if ($value->a+$value->b c || $value->a+$value->c b || $value->b+$value->c a) return true;
});
$valid = array('must_be' => (object) array(
'a' => 'integer',
'b' => 'integer',
'c' => 'integer'
), 'triangle');
var_dump(Strain::it($value, $valid)); // (TRUE — если ошибка, FALSE — если всё ок)
*протестировано
+1
придумал еще более компактный способ без объявления функций:
$value = (object) array(
'a' => 2,
'b' => 3,
'c' => 4
);
$valid = array((object) array(
'a' => 'integer',
'b' => 'integer',
'c' => 'integer'
), function($value, $options = null) {
if ($value->a+$value->b <= $value->c || $value->a+$value->c <= $value->b || $value->b+$value->c <= $value->a) return true;
});
var_dump(Strain::it($value, $valid));
правда, класс такой метод не съел, пришлось его дописать. со следующего коммита на GitHub'е эта запись станет корректной и будет работать.
осталось только по тестам прогнать.
$value = (object) array(
'a' => 2,
'b' => 3,
'c' => 4
);
$valid = array((object) array(
'a' => 'integer',
'b' => 'integer',
'c' => 'integer'
), function($value, $options = null) {
if ($value->a+$value->b <= $value->c || $value->a+$value->c <= $value->b || $value->b+$value->c <= $value->a) return true;
});
var_dump(Strain::it($value, $valid));
правда, класс такой метод не съел, пришлось его дописать. со следующего коммита на GitHub'е эта запись станет корректной и будет работать.
осталось только по тестам прогнать.
0
1) в разы сложнее.
2) нету такой гибкости -> область применения много меньше.
3) завязано на классах… точнее увязано в классы.
4) сложнее интегрируется. (если не родной фреймворк)
5) неоправданно много внутренней логики.
Не вижу смысла тянуть за собой таких гигантов, когда нужно лишь проверить данные или преобразовать их в нужную структуру.
И да… вы кажется тоже не прочитали статью. Я предлагаю метод близкий к нативному, но при этом очень функциональный.
2) нету такой гибкости -> область применения много меньше.
3) завязано на классах… точнее увязано в классы.
4) сложнее интегрируется. (если не родной фреймворк)
5) неоправданно много внутренней логики.
Не вижу смысла тянуть за собой таких гигантов, когда нужно лишь проверить данные или преобразовать их в нужную структуру.
И да… вы кажется тоже не прочитали статью. Я предлагаю метод близкий к нативному, но при этом очень функциональный.
-1
Мой коммент был к тому, что перечисленные библиотеки умеют больше. Написанные валидаторы/фильтры, внятный сбор ошибок валидации, продвинутая валидация объектов (в том числе через аннотации).
В целом легковесность радует, но вот много «магии» и полная свобода форматов аргументов несколько пугают. Ждем версии с каким-то юзабельным кол-вом фильтров/валидаторов.
В целом легковесность радует, но вот много «магии» и полная свобода форматов аргументов несколько пугают. Ждем версии с каким-то юзабельным кол-вом фильтров/валидаторов.
0
Согласен, однако внятный сбор ошибок валидации тут присутствует. И при грамотном использовании его внятность куда выше чем у описанных вами библиотек, хотя фантазии нужно много, не спорю :). Другое дело, что набора фильтров тут действительно пока нету. То есть я их уже написал немало, но с использованием других моих классов, причем так, что тупо выдирать их смысла нету. Возможно в ближайшее время у меня дойдут руки и я перепишу фильтры, а пока, кому интересно, могут просто побаловаться с самим классом.
Тем более, тут интересна сама идея. Хороший программист поняв идею сам за день-два напишет все необходимые фильтры. Хотя ввести какой-нибудь стандарт было бы действительно полезно. Тем более, что он мною уже почти доработан. Постараюсь всё доделать)
Тем более, тут интересна сама идея. Хороший программист поняв идею сам за день-два напишет все необходимые фильтры. Хотя ввести какой-нибудь стандарт было бы действительно полезно. Тем более, что он мною уже почти доработан. Постараюсь всё доделать)
0
НЛО прилетело и опубликовало эту надпись здесь
Да, отличный способ реализовать анонимки в для моего класса. Но его функционал по сбору ошибок и удобство декларирования сложных структур данных (со сложной логикой проверки) это не отменяет.
0
Ваш класс не нужен :(. У filter есть FILTER_CALLBACK
+1
Разумеется есть, и что? Вы почитайте, как класс используется и какие у него возможности, особенно тот пример, который мы разобрали в комментариях.
Функционал класса не ограничивается проверкой одной переменной какой-либо функцией.
Функционал класса не ограничивается проверкой одной переменной какой-либо функцией.
0
Поймите, я не против велосипедов и велосипедистов. Просто в данном случае, ну ничего нового не добавлено. Функционал filter гораздо шире (например, обратите внимание на флаги, и на возможности sanitize). У вас, например, на каждый фильтр по регэкспу придется свою функцию писать.
0
Почему бы вам, вместо того, чтобы ругать велосипеды, взять и почитать внимательно статью. Вы поймете, что очень ошибаетесь в своих утверждениях.
Sanitize (оно же по-русски «приведение»), которого тут якобы нету, написано аж в заголовке!
Для всех регекспов нужен лишь один фильтр и использовать его можно следующим образом.
$str = 'Some Text';
Strain::it($str, array('regexp' => '/^[A-Za-z0-9 ]+$/'));
а вот так будет выглядеть ваш sanitize:
Strain::it($str, array('regexp_replace', => array('/ /', '_')));
// содержимое функций не привожу, там обычные preg_match и preg_replace.
Sanitize (оно же по-русски «приведение»), которого тут якобы нету, написано аж в заголовке!
Для всех регекспов нужен лишь один фильтр и использовать его можно следующим образом.
$str = 'Some Text';
Strain::it($str, array('regexp' => '/^[A-Za-z0-9 ]+$/'));
а вот так будет выглядеть ваш sanitize:
Strain::it($str, array('regexp_replace', => array('/ /', '_')));
// содержимое функций не привожу, там обычные preg_match и preg_replace.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Strain It! — Валидация и приведение данных на PHP