Как стать автором
Обновить

Комментарии 25

Забавно в нём только использование плюшек PHP5. Как таковой код ооочень врядли кто-то будет брать в проект — риск потратить время и силы на внедрение непонятного велик. А так — у каждого в загашнике есть свой валидатор — вылизанный и известный до последней строки.
Согласен, внедрение почти всегда процесс довольно сложный, но если использовать этот класс самого начала, то можно получить определенный профит.

К тому же, это не просто валидатор. Возможность привести непонятные данные к строгой структуре может быть востребована где угодно в разработке.
не понятно, почему Strain::it($var, 'is_integer') при ошибке должно выводить true, может лучше пусть выводит true если ошибки нет?
Да, довольно непонятно написал. Я уже, если вы заметили, поправил название на 'must_be_integer' чтобы никого не вводить в заблуждение. TRUE — говорит нам о наличии ошибки.

Тут можно поспорить о том, как лучше. Ваш вариант более интуитивный, мой — более логичный, потому что при фильтрации объектов удобнее анализировать Strain::$result конструкцией if, например if($result->name), ведь там может быть и TRUE и строка содержащая информацию об ошибке. В вашем случае нужно будет писать if($result->name !== true).

Это единственная причина такой путаницы.
Если вас это уж совсем смущает, то отредактируйте метод it(), чтобы возвращал наоборот. Там всё предельно просто.
всё довольно сложно… с must_be_integer еще хуже… наверно никто не будет юзать такое…
От комментариев воздержусь. Дочитайте до конца статью и не забудьте почитать первый апдейт к ней в самом низу.
Нечто похожее на JS есть и не одно. Например jquery.validate плагин.

$triangle = array(
'a' => 2,
'b' => 3,
'c' => 5
);


Как вашим классом проверить, что a+b < c, a+c < b, b+c < a?
ой… не меньше, а больше… ну не суть важно.
Подозреваю, как-то так:
    Strain::add('must_be_integer', function(&$value, $options = null) {
        if(!is_int($value)) return true;
    });
Ой. Случайно отправилось раньше. Имел ввиду так:
Strain::add('is_triangle', function($value, $options = null) {
    return $value['a']+$value['b'] < $value['c'], $value['a']+$value['c'] < $value['b'], $value['b']+$value['c'] < $value['a'];
});
Я понял вашу идею, но вы привели слишком плохой «пример». Действительно, такую операцию можно запихнуть в функцию. Поэтому я усложню задачу. Допустим, помимо вашего условия, нам нужно проверить исходные данные (или привести их к 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 — если всё ок)

*протестировано
куда-то скушались знаки «меньше или равно» в функции 'triangle', будьте внимательны.
придумал еще более компактный способ без объявления функций:

$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'е эта запись станет корректной и будет работать.
осталось только по тестам прогнать.
1) в разы сложнее.
2) нету такой гибкости -> область применения много меньше.
3) завязано на классах… точнее увязано в классы.
4) сложнее интегрируется. (если не родной фреймворк)
5) неоправданно много внутренней логики.

Не вижу смысла тянуть за собой таких гигантов, когда нужно лишь проверить данные или преобразовать их в нужную структуру.

И да… вы кажется тоже не прочитали статью. Я предлагаю метод близкий к нативному, но при этом очень функциональный.
Мой коммент был к тому, что перечисленные библиотеки умеют больше. Написанные валидаторы/фильтры, внятный сбор ошибок валидации, продвинутая валидация объектов (в том числе через аннотации).
В целом легковесность радует, но вот много «магии» и полная свобода форматов аргументов несколько пугают. Ждем версии с каким-то юзабельным кол-вом фильтров/валидаторов.
Согласен, однако внятный сбор ошибок валидации тут присутствует. И при грамотном использовании его внятность куда выше чем у описанных вами библиотек, хотя фантазии нужно много, не спорю :). Другое дело, что набора фильтров тут действительно пока нету. То есть я их уже написал немало, но с использованием других моих классов, причем так, что тупо выдирать их смысла нету. Возможно в ближайшее время у меня дойдут руки и я перепишу фильтры, а пока, кому интересно, могут просто побаловаться с самим классом.
Тем более, тут интересна сама идея. Хороший программист поняв идею сам за день-два напишет все необходимые фильтры. Хотя ввести какой-нибудь стандарт было бы действительно полезно. Тем более, что он мною уже почти доработан. Постараюсь всё доделать)
НЛО прилетело и опубликовало эту надпись здесь
бог мой… никаких лицензий… копируйте и пользуйте на здоровье… там две страницы кода :)

Лицензия скорее всего будет введена с версией 1 и то исключительно на набор функций, но никак не на сам класс.
Да, отличный способ реализовать анонимки в для моего класса. Но его функционал по сбору ошибок и удобство декларирования сложных структур данных (со сложной логикой проверки) это не отменяет.
Ваш класс не нужен :(. У filter есть FILTER_CALLBACK
Разумеется есть, и что? Вы почитайте, как класс используется и какие у него возможности, особенно тот пример, который мы разобрали в комментариях.

Функционал класса не ограничивается проверкой одной переменной какой-либо функцией.
Поймите, я не против велосипедов и велосипедистов. Просто в данном случае, ну ничего нового не добавлено. Функционал filter гораздо шире (например, обратите внимание на флаги, и на возможности sanitize). У вас, например, на каждый фильтр по регэкспу придется свою функцию писать.
Почему бы вам, вместо того, чтобы ругать велосипеды, взять и почитать внимательно статью. Вы поймете, что очень ошибаетесь в своих утверждениях.

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.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории