Страница 1 из 3

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

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

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

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

Спасибо.

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

Добавлено: 2015.08.04, 18:35
mickgeek
Когда-то обсуждали нечто подобное.

viewtopic.php?f=19&t=19209

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

Добавлено: 2015.08.04, 19:14
samdark
Тогда не получится применять их в определённом порядке.

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

Добавлено: 2015.08.04, 19:34
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],
        ];
    }

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

Добавлено: 2015.08.04, 21:53
samdark
Зачем так усложнять?

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

Добавлено: 2015.08.05, 00:11
zelenin
вообще правильнее убрать все фильтры и дефолты, вынеся их например в поведения. Валидация должна валидировать, а не менять содержимое. Александр, создадите ишью для обсуждения? Или вполне вероятно, что такое обсуждение уже было.

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

Добавлено: 2015.08.05, 08:23
yiijeka
было. Всё оставили как есть, но все высказались, что не совсем корректно всё хранить вместе.

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

Добавлено: 2015.08.05, 11:06
samdark
С одной стороны не совсем корректно, с другой разделение всё страшно усложняет: иногда надо выполнять фильтрацию после валидации или в процессе валидации.

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

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

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

Добавлено: 2015.08.05, 13:09
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],
        ];
    }
Чтобы что то куда то делить, нужны веские основания. У вас они есть?

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

Добавлено: 2015.08.05, 13:12
samdark
Кстати, не нашёл прошлых обсуждений...

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

Добавлено: 2015.08.05, 13:20
yiijeka

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

Добавлено: 2015.08.05, 13:27
samdark
О, вот там и примеры нашлись. Тот же HTMLPurifier...

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

Добавлено: 2015.08.05, 14:29
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

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

Добавлено: 2015.08.05, 14:30
zelenin
Sam Dark писал(а):О, вот там и примеры нашлись. Тот же HTMLPurifier...
так ради бога (см. выше). Если надо до валидации или после есть поведения.

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

Добавлено: 2015.08.05, 14:48
samdark
И как это будет выглядеть в поведении в сравнении с тем, как это выглядит сейчас? Уложится в одну строчку?

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

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

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

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

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

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

[
'class' => 'AttributeBehavior',
'attributes' => ['content'],
'value' => function(Event $event) {return trim($event->sender->content}, //ну или как там - не суть, можно запилить поведение для обработки функциями типа trim итд
]
 

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

Добавлено: 2015.08.05, 15:12
mickgeek
Можно голосовалку в топик добавить, кто за разделение и кто против. Но первый вариант, вероятно, будет лидировать.

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

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

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

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

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

Но на интересную мысль, кстати, навели. Метод у нас называется rules(), так что можно поменять гайд и описание и везде заменить "validation rules" на "filtering and validation rules".

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

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