Pull to refresh

Comments 32

Возможно я не увидел этого, но где валидация многомерных данных? Например, с помощью Symfony валидатора я могу делать такую валидацию:
Код
'rules' => new Assert\Optional([
                    new Assert\Type(['type' => 'array']),
                    new Assert\All([
                        'constraints' => [
                            new Assert\Collection([
                                'week_days' => [
                                    new Assert\Type(['type' => 'array']),
                                    new Assert\Count([
                                        'min' => 1,
                                        'max' => 7,
                                    ]),
                                    new Assert\All([
                                        'constraints' => [
                                            new Assert\Choice(['choices' => range(0, 6)]),
                                        ]
                                    ]),
                                ],
                                'hours' => [
                                    new Assert\Type(['type' => 'array']),
                                    new Assert\Count([
                                        'min' => 1,
                                        'max' => 24,
                                    ]),
                                    new Assert\All([
                                        'constraints' => [
                                            new Assert\Choice(['choices' => range(0, 23)]),
                                        ]
                                    ]),
                                ],
                                'group_id' => new Assert\Optional(new Assert\Type(['type' => 'integer'])),
                            ])  
                        ]
                    ]),
                ]),

Да. На самом деле, это упущение как статьи, так и документации. Валидация многомерных данных есть:

$rules = ['attribute.nested.nested' => function() { ... }]
$messages = ['attribute.nested.nested' => 'Атрибут не может быть таким-секим']

как-то это дико неудобно выглядит.

может быть представлено объектом класса правила или замыканием

Это называется по-русски «анонимная функция» или «лямбда-функция». Использование термина «Closure» в PHP — ошибка разработчиков, в которой они не раз уже каялись.
Если бы пост был на английском и автор использовал термин «Closure», то вы сообщили, что по-английски это называется «anonymous function» или «lamba function»?
Да.
Closure — это замыкание контекста на Lambda. А никак не сама Lambda.

Во-первых, не замыкание контекста на анонимную функцию, а замыкание анонимной функции на контекст.
Во-вторых анонимные функции в php, хотя и не замыкаются на контекст исполнения, тем не менее могут сменить внутренний контекст (ссылку) $this в ручном режиме (Closure::bind(), $func->bindTo()), и быть в этом смысле замкнуты на переданный объект.
Таким образом, однозначно утверждать, являются ли анонимные функции в php замыканиями или нет — нельзя. И уж тем более сложно говорить о том, хорошо это или плохо. Это просто особенность языка и ее нужно знать. А Ваши выкрики в духе "ололо! Closure — не Clousre!", просто неуместны. Ибо статья о разработке на PHP написана разработчиком PHP для разработчиков PHP. И мы — разработчики PHP прекрасно понимаем, что значит замыкание в контексте PHP. Так что, в принципе, носом нас в это можно и не тыкать.

А Ваши выкрики в духе «ололо! Closure — не Clousre!

О, выкрики нашли и „ололо“. Не процитируете ли?
С каких это пор вежливое указание на терминологическую неточность стало вдруг „выкриками“?

Если автор сочтет замечание существенным — исправит. Нет — ну и на здоровье. Вы-то что так волнуетесь?
А что насчет многоязычности? Вручную все сообщения прописывать? И опять же, каков смысл еще одной библиотеки если есть дургие? Какие отличия?
Сейчас «из коробки» сообщений нет, поэтому да, пока прописывать вручную. И я не уверен, стоит ли реализовывать многоязычность, ведь это можно сделать самостоятельно (псевдокод):

$messages = ['attribute' => i18n('validation.attribute.not_empty')]

Я думаю, было бы отличным решением, дать пользователю возможность, самому определить методику перевода.


Например так (псевдокод):


$validator = $serviceLocator->get('validator');
$translator = $serviceLocator->get('lang');

$validatror->setTranlator(function($phrase) use ($translator){
   return $translator->translate(phrase);
});
Т.е. чтобы можно было просто писать ключи вместо конкретных фраз и потом их переводить через кастомный сервис?
По моему скромному мнению, в библиотеку для валидации не нужно добавлять это. Валидатор возвращает массив ошибок, его и нужно переводить.
еще одна обязательная строчка в коде для мультиязычных и иноязычных приложений после каждой валидации? Не думаю что это хорошее решение

1) Это всего лишь возможность. Никто не заставляет ей пользоваться.
2) Это декларативно. Единожды объявил переводчик, и забыл.
3) Это позволит не городить "беготню" по массивам самому.
4) Это ооп в конце-то концов.


И я действительно не понимаю, какую проблему может доставить делегирование дополнительного функционала любому объекту на Ваш выбор.

две проблемы:
1) время
2) поддержка
Которые могут стать не такими обременительными, если стать контрибьютером и дополнить код на гитхабе. Но опять таки — зачем? ведь есть же другие либы где все это уже есть…

Время на создание и поддержку одной единственной обертки над выводом ошибок? Вы серьезно? Ровно 20 минут. При том и на создание и на всю будущую поддержку. Вообще 10, но я еще столько же накинул на придумывание названий для двух методов и одного свойства.

я подразумевал не обертку, а законченный рабочий код

Ну а вопрос "зачем" — это к автору.

Ну, грубо говоря она рассчитана на тех, кто собирает собственные фреймворки из разнородных компонентов вместо использования одного «полноценного» и большого. При этом я согласен, что некоторых функций пока может не хватать в сравнении с аналогами. А остальное — дело вкуса)
вы не ответили на вопрос
И опять же, каков смысл еще одной библиотеки если есть другие? Какие отличия?
Отличия в использовании я хочу разобрать в одной из следующих статей. В частности, если не брать валидаторы от Laravel и Symfony, остальные используют так называемый fluent интерфейс или цепочки методов. Мне такой подход показался не очень удобным и я решил попробовать создать альтернативу) По поводу смысла: вначале это был спортивный интерес, но сейчас на работе идёт процесс рефакторинга, и я хочу в итоге внедрить эту библиотеку.
сейчас на работе идёт процесс рефакторинга, и я хочу в итоге внедрить эту библиотеку.

Вот этого делать не стоит. Так как у вас нет веских причин
Мне такой подход показался не очень удобным и я решил попробовать создать альтернативу

Тоже так себе аргумент. достаточно было бы написать обертку как вам нравится. Но опять таки — зачем делать тоже самое, просто в другой оболочке без значительных изменений? Людям гораздо проще работать с вещами которые им уже знакомы, пусть и сделанные с неудобной архитектурой.
И еще у вас нет поддержки ICU в сообщениях
если не брать валидаторы от Laravel и Symfony

а почему их не брать? Оба валидатора хорошие и оба можно использовать как самостоятельные пакеты к любому проэкту. B обеих больше функционала, чем в вашем валидаторе и за обеими стоят изестные разработчики и комньюнити.
Я имел в виду, что они не используют цепочки методов как способ создания правил.

Это тип недостаток или что? Вместо того что бы писать свой валидатор проще сделать отдельный пакет, который добавляет fluent-интерфейс для построения правил и реюзает все возможности этих валидаторов.

Я не говорил, что это недостаток :) Целью я себе ставил сделать валидатор «почти как в Laravel», но с возможностью указывать непосредственно в массиве правил классы и Closure.

Повторюсь — "реализовать другой способ задания правил" и "написать свой валидатор" это чуть разные задачи. Просто меня ситуация с валидаторами слегка удручает) Я пока использую symfony/serializer но мне приходится писать кастомные валидаторы что бы пофиксить баги и "неудобства" при использовании оного без форм.

Sign up to leave a comment.

Articles