Comments 31
@franzose Посмотрел вашу библиотеку, есть несколько моментов:
- вы не проверяете вводимые настройки для валидации так же не проверяете, а доступен ли валидатор для конкретно этого типа. Пример для Length.php
- ваш валидатор подходит только для проверки пользовательского ввода. Это не то, что бы недостаток, а скорее ограничение применения. В случае, если проверять придется много — ваш валидатор станет довольно прожорливой штукой так как на каждую проверку создается тьма объектов.
- По своему опыту скажу: задание правил проверки в стиле "not_empty|length:5,15" для крупных проектов — скорее минус, чем плюс. Так как корректность этих правил вы можете узнать на момент запуска, а не на момент написания.
Посмотрите на досуге: ko-ko-ko/assert
правила в стиле not_empty|length:5,15
Дополню список проблем:
- Если передать в качестве аргумента строку с запятой, все сломается (говорю исходя из кода).
- Нет возможности передать массив, да даже если его и передавать, например как JSON, будут опять же проблемы из п.1 с запятыми
Т.е. в библиотеке такое определение работает «иногда».
Сделайте правильный выбор
Выбираю Zend\Validator :)
Итого гибкость, заменяемость, контрактное программирование итд.
UPD: причем в таких «узких» валидаторах необязательно пользоваться либами. Можно простые проверки делать базовыми функциями типа is_int, а сложные (проверка емейла с тысячью доменов первого уровня) — с использованием специализированных валидаторов.
Немного усложню кейс.
Допустим поле email необязательное.
А вот если ставим галочку «подписаться на новости» — то теперь поле email становится обязательным.
Какая из библиотек умеет работать с такой логикой?
В Yii это делается через сценарии. Т.е. вначале валидации надо указать сценарий (с подпиской, или без подписки), а в самих правилах указать как действовать в том или ином сценарии.
Можно переопределить конструктор и передать значение в него. Немного костыльно, но как вариант.
А если так:
1) Физическое или Юридическое
2) Если юридическое — то нужны новые обязательные поля (ИНН, Юр адрес, и ещё 100500 полей)
И получается чо надо создать множество правил, в которых надо проверить галочку. Которую, кстати, тоже надо проверить.
Чуть ниже уже писали, что это уже бизнес-логика и такое должна валидировать модель. Форма должна валидировать только формат, а модель — сущности. То есть в вашем случае валидатор формы должен проверить: поле email либо пустое, либо проходит через валидацию формата email. А модель проверяет, что поле email заполнено при проставленном флаге.
$user = new User(...);
if ($request->get('subscribe_to_news')) {
$subscriber->subscribeToNews($user); // может бросить исключение UserEmailRequired
}
И тут уж проще добавить правило в валидацию формы, чем ловить исключение и вручную формировать ответ.
required_if:anotherfield,value,…
required_unless:anotherfield,value,…
required_with:foo,bar,…
required_with_all:foo,bar,…
required_without:foo,bar,…
required_without_all:foo,bar,…
Такие standalone-библиотеки, как мне кажется, в основном рассчитаны на тех, кто собирает какие-то свои решения из набора компонентов, а не использует готовые фреймворки. И оба подхода имеют право на существование)
$data = array(
'name' => 'Pixie',
'home' => array(
'location' => 'forest',
'name' => 'Oak'
),
'spells' => array(
'charm' => array(
'name' => 'Charm Person',
'type' => 'illusion'
),
'blast' => array(
'name' => 'Fire Blast',
'type' => 'evocation'
),
// ....
)
);
Что фактически необходимо при работе со всякими ангулярами и MongoDB
Вопрос: Kontrolio так умеет? В частности:
- проверку «вложенных» структур и массивов,
- запрет/разрешение лишних атрибутов,
- запрет/разрешение отсутствия атрибута.
Ни в коем случае не нападаю, просто интересуюсь, а тратить время на эксперименты с вашей библиотекой не хочется. Если есть — отлично. Если нет — имейте в виду. ;)
Вложенные массивы Kontrolio валидировать умеет. Возможно, не так красиво по сравнению с другими решениями. Можно записать так:
$rules = ['attr.nested.nested.nested' => 'not_empty'];
$messages = ['attr.nested.nested.nested' => 'Не может быть пустым.'];
Отсутствие атрибута можно разрешить правилом Sometimes
:
$rules = ['attr.nested.nested.nested' => [new Sometimes, new Length(5, 15)];
А вот «лишние» атрибуты не умеет отфильтровывать. Грубо говоря, что в библиотеку передали, то она и будет валидировать :)
Валидировали, валидировали… и вывалидировали! Сравниваем валидаторы данных в PHP