разделить rules на 2 части

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.

Нужно ли разделить rules() на два метода под фильтры и валидаторы?

Да
16
47%
Нет
12
35%
Мне всё равно
6
18%
 
Всего голосов: 34

Bio man
Сообщения: 609
Зарегистрирован: 2013.07.22, 10:40

разделить rules на 2 части

Сообщение Bio man »

Никого не смущает то, что в методе rules() валидаторы и фильтры собраны в 1 кучу?
Ведь по идеи валидаторы должны читать атрибуты, но не изменять их значения.

Почему бы не разделить это добро на 2 логических группы:
1. Валидаторы - проверяют атрибуты на соответствие бизнес-правилам, не могут изменять атрибуты
2. Фильтры - обрабатывают атрибуты по каким-то бизнес-правилам, могут изменять атрибуты в соответствии с правилами (например, существующий "валидатор" default является фильтром)

Есть в этом смысл или я опять бред несу?

Спасибо.
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: разделить rules на 2 части

Сообщение mickgeek »

Когда-то обсуждали нечто подобное.

viewtopic.php?f=19&t=19209
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: разделить rules на 2 части

Сообщение samdark »

Тогда не получится применять их в определённом порядке.
Bio man
Сообщения: 609
Зарегистрирован: 2013.07.22, 10:40

Re: разделить rules на 2 части

Сообщение Bio man »

Ну а если как-то так сделать?

Код: Выделить всё

    public function rules()
    {
        return [
            ['text', 'required', 'before' => 'purify'], // before filter named 'purify'
            ['status', 'integer', 'after' => 'default'], // after all default filters
        ];
    }

    public function filters()
    {
        return [
            'purify' => ['text', 'purify'], // inline filter
            ['status', 'default', 'value' => 1],
        ];
    }
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: разделить rules на 2 части

Сообщение samdark »

Зачем так усложнять?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: разделить rules на 2 части

Сообщение zelenin »

вообще правильнее убрать все фильтры и дефолты, вынеся их например в поведения. Валидация должна валидировать, а не менять содержимое. Александр, создадите ишью для обсуждения? Или вполне вероятно, что такое обсуждение уже было.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: разделить rules на 2 части

Сообщение yiijeka »

было. Всё оставили как есть, но все высказались, что не совсем корректно всё хранить вместе.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: разделить rules на 2 части

Сообщение samdark »

С одной стороны не совсем корректно, с другой разделение всё страшно усложняет: иногда надо выполнять фильтрацию после валидации или в процессе валидации.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: разделить rules на 2 части

Сообщение zelenin »

Sam Dark писал(а):С одной стороны не совсем корректно, с другой разделение всё страшно усложняет: иногда надо выполнять фильтрацию после валидации или в процессе валидации.
без примеров довод не принимается.
Аватара пользователя
creocoder
Сообщения: 138
Зарегистрирован: 2010.01.24, 05:29
Откуда: Тамбов

Re: разделить rules на 2 части

Сообщение creocoder »

zelenin писал(а):
Sam Dark писал(а):С одной стороны не совсем корректно, с другой разделение всё страшно усложняет: иногда надо выполнять фильтрацию после валидации или в процессе валидации.
без примеров довод не принимается.
Вот конкретный пример:

Код: Выделить всё

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            ['name', 'filter', 'filter' => 'trim'],
            ['name', 'required'],
            ['name', 'string', 'max' => 255],

            ['email', 'filter', 'filter' => 'trim'],
            ['email', 'required'],
            ['email', 'email'],
            ['email', 'string', 'max' => 255],
            [
                'email',
                'unique',
                'targetClass' => 'common\models\UserEmail',
                'targetAttribute' => 'value',
                'message' => 'This email address has already been taken.',
            ],

            ['password', 'required'],
            ['password', 'string', 'min' => 6],
        ];
    }
Чтобы что то куда то делить, нужны веские основания. У вас они есть?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: разделить rules на 2 части

Сообщение samdark »

Кстати, не нашёл прошлых обсуждений...
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: разделить rules на 2 части

Сообщение samdark »

О, вот там и примеры нашлись. Тот же HTMLPurifier...
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: разделить rules на 2 части

Сообщение zelenin »

creocoder писал(а):
zelenin писал(а):
Sam Dark писал(а):С одной стороны не совсем корректно, с другой разделение всё страшно усложняет: иногда надо выполнять фильтрацию после валидации или в процессе валидации.
без примеров довод не принимается.
Вот конкретный пример:

Код: Выделить всё

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            ['name', 'filter', 'filter' => 'trim'],
            ['name', 'required'],
            ['name', 'string', 'max' => 255],

            ['email', 'filter', 'filter' => 'trim'],
            ['email', 'required'],
            ['email', 'email'],
            ['email', 'string', 'max' => 255],
            [
                'email',
                'unique',
                'targetClass' => 'common\models\UserEmail',
                'targetAttribute' => 'value',
                'message' => 'This email address has already been taken.',
            ],

            ['password', 'required'],
            ['password', 'string', 'min' => 6],
        ];
    }
 
Чтобы что то куда то делить, нужны веские основания. У вас они есть?
пример чего? что тримится должно перед валидацией? да, так и должно быть, но ПЕРЕД валидацией, а не в начале валидации.
Основания: валидация не должна изменять данные. Она должна выплюнуть ошибку. А тримы замечательно запихнуть в поведения на BEFORE_VALIDATE, используя тот же AttributeBehavior
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: разделить rules на 2 части

Сообщение zelenin »

Sam Dark писал(а):О, вот там и примеры нашлись. Тот же HTMLPurifier...
так ради бога (см. выше). Если надо до валидации или после есть поведения.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: разделить rules на 2 части

Сообщение samdark »

И как это будет выглядеть в поведении в сравнении с тем, как это выглядит сейчас? Уложится в одну строчку?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: разделить rules на 2 части

Сообщение zelenin »

Sam Dark писал(а):И как это будет выглядеть в поведении в сравнении с тем, как это выглядит сейчас? Уложится в одну строчку?
Александр, я привел довод: валидация должна валидировать. Причем тут "как это будет выглядеть в поведении в сравнении с тем, как это выглядит сейчас"? Мы же правильность обсуждаем.

да и выглядеть это будет не сильно сложно:

Код: Выделить всё

[
'class' => 'TrimBehavior',
'attributes' => [...]
]
 
или

Код: Выделить всё

[
'class' => 'AttributeBehavior',
'attributes' => ['content'],
'value' => function(Event $event) {return trim($event->sender->content}, //ну или как там - не суть, можно запилить поведение для обработки функциями типа trim итд
]
 
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: разделить rules на 2 части

Сообщение mickgeek »

Можно голосовалку в топик добавить, кто за разделение и кто против. Но первый вариант, вероятно, будет лидировать.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: разделить rules на 2 части

Сообщение samdark »

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

Пример creocoder выше дал простенький. Если туда добавится default, htmlpurifier и ещё пара типов фильтрации, то в случае с behavior-ами:

1. Кода писать надо будет больше.
2. Выглядит это объективно сложнее.
3. Behavior работает несколько медленней.

Даже если вместо rules() сделать validationRules() и filteringRules() кое-что теряется. А именно возможность иметь рядом правила для поля, а не бегать между методами, чтобы понять, что происходит.

Но на интересную мысль, кстати, навели. Метод у нас называется rules(), так что можно поменять гайд и описание и везде заменить "validation rules" на "filtering and validation rules".
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: разделить rules на 2 части

Сообщение zelenin »

Sam Dark писал(а):Обсуждать правильность в отрыве от практичности и удобства использования — это нормально пока это не приводит к изменениям, которые делают этот параметр хуже.
Александр, вы сейчас про спички. Удобство остается такое же. Одну строчку поменяли на две - некритично. Бегать туда-сюда не надо, т.к. это разные вещи и их не нужно противопоставлять в этом примере. Кода писать также больше не нужно - делаем еще одно поведение, куда передаем атрибуты и колбэки функций - все остается в таком же (!) виде, как и в валидации, только добавляется класс поведения.
Ответить