Почему в Yii2 есть валидаторы на mongoid, json

Обсуждаем, как правильно строить приложения
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение maleks »

rugabarbo писал(а): 2017.03.13, 18:50 Я вообще не представляю, какие железные нервы надо иметь, чтобы такие вещи рефакторить: viewtopic.php?t=16786 – поэтому в проектах сделанных на Yii у меня никогда не бывает сценариев и правил валидации в AR.
Как тогда вы бы переделали этот пример?
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение rugabarbo »

maleks писал(а): 2017.03.14, 10:15
rugabarbo писал(а): 2017.03.13, 18:50 Я вообще не представляю, какие железные нервы надо иметь, чтобы такие вещи рефакторить: viewtopic.php?t=16786 – поэтому в проектах сделанных на Yii у меня никогда не бывает сценариев и правил валидации в AR.
Как тогда вы бы переделали этот пример?
Один пользовательский ввод - один Form-класс. Я уже давно так делаю, если приходится иметь дело с Yii.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение samdark »

Представим, что мы строим дом вместо разработки ПО, а архитектура ПО это фундамент. Если его плохо заложить, то со временем дом придет в негодность и поможет только постройка нового дома.
Программирование и архитектура/строительство далеко не тождественны, так что аналогия не уместна.

Кстати, чаще всего форма отличается по данным от БД, а не совпадает с ней (кроме приложений-блогов, и то там даты). Может реально рекомендацию напишиете, что нужно разделять?
Да, можно и написать. Где именно уместней будет?

Ну и про формат я немного не согласен. Прозрачное приведение типа или формата в обе стороны — это вполне себе часть модели. Например, прозрачное получение и запись в атрибут JSON, когда хранится это дело на самом деле в строке.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение maleks »

rugabarbo писал(а): 2017.03.14, 10:31 Один пользовательский ввод - один Form-класс. Я уже давно так делаю, если приходится иметь дело с Yii.
Т.е. в этом примере у вас будут следующие классы форм - UserRegistrationForm, UserUpdateByAdminForm, UserUpdateByModeratorForm, UserChangeEmailForm, UserChangePasswordForm с дублирующимися в каждой одними и теми же правилами?
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение rugabarbo »

maleks писал(а): 2017.03.14, 10:39
rugabarbo писал(а): 2017.03.14, 10:31 Один пользовательский ввод - один Form-класс. Я уже давно так делаю, если приходится иметь дело с Yii.
Т.е. в этом примере у вас будут следующие классы форм - UserRegistrationForm, UserUpdateByAdminForm, UserUpdateByModeratorForm, UserChangeEmailForm, UserChangePasswordForm с дублирующимися в каждой одними и теми же правилами?
Именно. Моя практика показывает, что дублируются не наборы правил, а сами правила, поэтому правила валидации я выношу в отдельные валидаторы и повторно их использую.

Стараться избежать дублирования самих наборов правил – это псведооптимизация. Это не то дублирование кода, которого нужно избегать.
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение rugabarbo »

Например, пользователя можем добавить из админки, а с другой стороны может добавиться он сам посредством регистрации на фронтенде. И в том и в другом случае нужно будет убедиться, что мейл ещё не занят. Мы создаём /common/components/validators/EmailUniquenessValidator и используем его среди правил валидации в любом Form-классе (как на фронте, так и на бэке).
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение maleks »

rugabarbo писал(а): 2017.03.14, 10:51 Стараться избежать дублирования самих наборов правил – это псведооптимизация. Это не то дублирование кода, которого нужно избегать.
Если по разным моделям будут раскиданы копии правила - [['somefield'], 'string', 'max' => 255], и чтобы это число изменить надо "вспомнить" все такие модели, то для меня это то дублирование, которого я бы хотел избежать
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение rugabarbo »

maleks писал(а): 2017.03.14, 11:08
rugabarbo писал(а): 2017.03.14, 10:51 Стараться избежать дублирования самих наборов правил – это псведооптимизация. Это не то дублирование кода, которого нужно избегать.
Если по разным моделям будут раскиданы копии правила - [['somefield'], 'string', 'max' => 255], и чтобы это число изменить надо "вспомнить" все такие модели, то для меня это то дублирование, которого я бы хотел избежать
Если поля формы заполняются лишь в одном месте, я прописываю именно так.

Если же это какой-нибудь мейл или другое часто-используемое поле, я создаю EmailLengthValidator. Это не сложно, а неймспейсы помогают разложить все валидаторы по полочкам.
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение rugabarbo »

А вообще, помнится, в старые добрые времена, когда я ещё писал на plain PHP (лет 12 назад), не было вообще никаких standalone-валидаторов и классов форм, а ввод проверялся обычным php-кодом. Работал в веб-студиях и геймдеве, проекты шли конвейером один за другим. Код переносился из проекта в проект обычным копированием, никаких композеров и в помине не было. И подобные магические числа (255) были раскиданы по всему коду. Конечно, сейчас я уже понимаю, что это был говнокод. Но могу с уверенностью сказать следующее:
1. Искать эти магические числа приходилось один раз в пятилетку и это не было проблемой.
2. Временные затраты на поиск и замену таких чисел были гораздо ниже временных затрат, которые мы испытали бы на написание standalone-сервисов, валидаторов и прочего подобного.

Поэтому мне кажется, что фраза "мне придётся вспомнить ВСЕ такие модели" выражает лишь некий гипертрофированный страх от потенциально-возможной работы, которую вам делать не придётся. А если придётся, вы это сделаете поиском по коду за 5 минут.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение maleks »

rugabarbo писал(а): 2017.03.14, 11:21 Если же это какой-нибудь мейл или другое часто-используемое поле, я создаю EmailLengthValidator. Это не сложно, а неймспейсы помогают разложить все валидаторы по полочкам.
Т.е на емаил с длиной 30 у вас будет один свой валидатор-обертка над емаил валидатором с захардкоденной проверкой на 30.
И так для всех таких проверок со св-вами.

Сначала пошла куча классов форм, теперь к ним добавились куча классов валидаторов, это уже целая методика, у которой как бы тоже не достает ни обоснования ни удобства.

В yii системно учат что сущность сама хранит свои правила валидации. (А AR модели - это тоже сущности, просто которые еще знают как себя сохранить в permanent storage )
Если вы эти правила валидации из сущности вынимаете и переносите во вспомогательные модели, такие как формы, то такой подход требует подробного разбирательства. Рецепты там, статьи, со всеми подноготными, т.к. вот эти костылики с классами захардкоденных валидаторов как по мне выглядят совсем не ахти
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение rugabarbo »

Я никому не навязываю. Хотите клиентскую валидацию держать внутри ORM - дело ваше. Я лишь изложил результаты собственного опыта.
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение rugabarbo »

К тому же я не отступал от Yii. В изложенной мной практике нет самописов. Я просто использую Yii иначе. Вам же почему-то показалось, что я изложил новую методику. Странно, неправда ли? (:
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение ElisDN »

maleks писал(а): 2017.03.14, 11:55 И так для всех таких проверок со св-вами...
А что сложного?

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

class UserSignupForm extends Model
{
    public $username;
    public $email;
    public $phone;
    public $password;    
    public $subscribe;
    public $agree;
    public $captcha;

    public function rules() {
        return [
            [['username', 'email', 'phone', 'password', 'agree'], 'required'],
            ['username', UsernameValidator::className()],
            ['email', EmailValidator::className()],
            ['phone', PhoneValidator::className()],
            [['username', 'email', 'phone'], 'unique', 'targetClass' => User::className()],
            ['password', PasswordValidator::className()],            
            ['subscribe', 'bool'],
            ['agree', 'compare', 'value' => '1'],
            ['captcha', CaptchaValidator::className()],
        ]
    }
}

class UserProfileEditForm extends Model
{
    public $email;
    public $phone;
    public $iсq;
    ...
    public function rules() {
        return [
            [['email', 'phone'], 'required'],
            ['phone', PhoneValidator::className()],
            ['email', EmailValidator::className()],
            [['phone', 'email'], 'unique', 'targetClass' => User::className(), 'filter' => ['!=', 'id', $this->user->id]],
            ['iсq', ICQValidator::className()],
        ]
    }
}
Сделали свои человекопонятные PhoneValidator и ICQValidator вместо куч регулякок и используем по всему сайту для User, Company, Order и т.п.
maleks писал(а): 2017.03.14, 11:55 Т.е на емаил с длиной 30 у вас будет один свой валидатор-обертка над емаил валидатором с захардкоденной проверкой на 30.
Со своим собственным EmailValidator мы и от фреймворка абстрагировались, и внешнюю связанность уменьшили, и тестируемость повысили. Надо будет поменять текст ошибки на всём сайте - переопределим $message:

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

class EmailValidator extends \yii\validator\EmailValidator
{
    public $message = '...';
}
Надо будет отфильтровывать адреса сервисов быстропочт или определённых доменов - сдекорируем метод validateValue.
maleks писал(а): 2017.03.14, 11:55 Если по разным моделям будут раскиданы копии правила - [['somefield'], 'string', 'max' => 255], и чтобы это число изменить надо "вспомнить" все такие модели, то для меня это то дублирование, которого я бы хотел избежать
Этот лимит 255 основан на VARCHAR из БД. Он не меняется никогда.
maleks писал(а): 2017.03.14, 11:55 Сначала пошла куча классов форм, теперь к ним добавились куча классов валидаторов, это уже целая методика, у которой как бы тоже не достает ни обоснования ни удобства.
Эта методика необоснована и неудобна только CRUD-кодерам, не заморачивающихся с Task Based UI и бизнес-требованиями.
maleks писал(а): 2017.03.14, 11:55 В yii системно учат что сущность сама хранит свои правила валидации. (А AR модели - это тоже сущности, просто которые еще знают как себя сохранить в permanent storage )
Да, системно учат неподерживаемому нетестируемому непереносимому database-first Yii-коду, где AR является не только строкой из базы, но и одновременно псевдосущностью, формой, валидатором ввода, хелпером, хранилищем файлов, рассыльщиком писем, ресурсом для API и моделью отображения.
maleks писал(а): 2017.03.14, 11:55 Если вы эти правила валидации из сущности вынимаете и переносите во вспомогательные модели, такие как формы, то такой подход требует подробного разбирательства.
А ещё сущности можно делать полноценными объектами с внутренним состоянием и инкапсулированным поведением, проверяющим все бизнес-требования. Для программирования именно code-first объектами, а не строками из базы. С разделением на интерфейс, бизнес-модель и инфраструктуру. Для моделирования процессов реального мира без заморочек с форматами полей в БД. С чётким разделением на обязанности. Эта методика называется "объектно-ориентированным программированием", с CRUD и AR имеющим мало чего общего.

P.S. Перенесите тему в раздел "Архитектура".
Последний раз редактировалось ElisDN 2017.03.14, 16:05, всего редактировалось 8 раз.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение samdark »

Перенёс.

Так-то да, AR — он на то и AR чтобы быстро что-то сфигачить и крудов наделать. В реально сложных проектах без нормального абстрагированного от всего слоя или слоёв обойтись тяжело. Но до сложных проектов дорастает, в лучшем случае, 10% всего запускаемого.
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение rugabarbo »

Понять, в какую сторону и как быстро будет расти проект, чтобы не переусердствовать с запасом гибкости - это и есть сложнейшая задача разработки. В каждом проекте золотая середина своя. Более того, по мере развития проекта она может меняться. Соответственно все эти споры в отвязке от состояния реального проекта не имеют смысла. У меня такой опыт и такие проекты, на них держать standalone-валидаторы выгодно, у вас могли быть другие проекты и другие расклады.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение maleks »

rugabarbo писал(а): 2017.03.14, 12:26 К тому же я не отступал от Yii. В изложенной мной практике нет самописов. Я просто использую Yii иначе. Вам же почему-то показалось, что я изложил новую методику. Странно, неправда ли? (:
А второй использует еще совсем по иначе, третий еще иначее. И имеем , вроде оно на фреймворке, но уже и не совсем, насколько такой код остается поддерживаемым сообществом... когда нет даже ни одной ссылки на подобный рецепт.
Т.е. ваша методика заключается в полном отказе от AR ?, что с помощью нее ничего не проектировать, а только может для доступа к базе чтобы выбирать данные? Все равно что позакрывать ей методы ->load, ->rules. Чем это не "новая методика" по сравнению с тем что официально предлагают всем делать в доках?
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение maleks »

ElisDN писал(а):А что сложного?
Я не против того как вы выкручиваетесь в этих случаях, думал просто может первому, примитивному(что по ссылке), варианту у вас имеются какие и получше варианты, но раз только такие, то ладно.
ElisDN писал(а):class UserProfileEditForm
А в реале будут
AdminCreateSimpleUserForm
ModeratorCreateSimpleUserForm
UserProfileEditForm
ModeratorEditOwnProfileForm
AdminEditOwnProfileForm
AdminEditSimpleUser
AdminEditModeratorUser
ModeratorEditOtherModeratorProfileForm
....

Одним св-вом или правилом отличные, они будут по сути содержать огромный дубляж, перетасовку, своей начинки,
а такими количествами, да и для всего вокруг, боюсь как чалму бы не пришлось завязывать из всего этого. :)
Последний раз редактировалось maleks 2017.03.14, 18:24, всего редактировалось 1 раз.
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение rugabarbo »

maleks писал(а): 2017.03.14, 17:46
rugabarbo писал(а): 2017.03.14, 12:26 К тому же я не отступал от Yii. В изложенной мной практике нет самописов. Я просто использую Yii иначе. Вам же почему-то показалось, что я изложил новую методику. Странно, неправда ли? (:
А второй использует еще совсем по иначе, третий еще иначее. И имеем , вроде оно на фреймворке, но уже и не совсем, насколько такой код остается поддерживаемым сообществом... когда нет даже ни одной ссылки на подобный рецепт.
Т.е. ваша методика заключается в полном отказе от AR ?, что с помощью нее ничего не проектировать, а только может для доступа к базе чтобы выбирать данные? Все равно что позакрывать ей методы ->load, ->rules. Чем это не "новая методика" по сравнению с тем что официально предлагают всем делать в доках?
http://www.yiiframework.com/doc-2.0/gui ... validators – как видите, я всё делаю по докам. Вы стали жертвой заманчивых возможностей Yii по размещению всего и вся внутри ActiveRecord. Но это лишь возможности, а не обязательное требование ко всем.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение maleks »

ElisDN писал(а): 2017.03.14, 14:19

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

class UserSignupForm extends Model
{
    public $username;
    public $email;
    public $phone;
    // ...
}

class UserProfileEditForm extends Model
{
    public $email;
    public $phone;
    public $iсq;
    ...

}
Чет вы в вашем примере скромно о attributeLabels() промолчали, не используете?
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Почему в Yii2 есть валидаторы на mongoid, json

Сообщение maleks »

rugabarbo писал(а): 2017.03.14, 18:20 http://www.yiiframework.com/doc-2.0/gui ... validators – как видите, я всё делаю по докам. Вы стали жертвой заманчивых возможностей Yii по размещению всего и вся внутри ActiveRecord. Но это лишь возможности, а не обязательное требование ко всем.
Ну и причем тут standalone-validators, если речь идет о вашем рецепте с AR (рулесы у них не использовать, да и походу их вообще не использовать).
Насчет "всего и вся внутри ActiveRecord" - это уже ваши домыслы, я о таком не говорил.
Но о том что есть непосредственная связь между объектами предметной области и хранящимися в БД данными, идее эксплуатируемой AR, есть док-ва и помимо мира yii, те же ER-модели. В БД лежат сущности, но почему бы им не стать программными сущностями.
Yii2 universal module sceleton - for basic and advanced templates
Ответить