Как тогда вы бы переделали этот пример?rugabarbo писал(а): ↑2017.03.13, 18:50 Я вообще не представляю, какие железные нервы надо иметь, чтобы такие вещи рефакторить: viewtopic.php?t=16786 – поэтому в проектах сделанных на Yii у меня никогда не бывает сценариев и правил валидации в AR.
Почему в Yii2 есть валидаторы на mongoid, json
Re: Почему в Yii2 есть валидаторы на mongoid, json
Re: Почему в Yii2 есть валидаторы на mongoid, json
Один пользовательский ввод - один Form-класс. Я уже давно так делаю, если приходится иметь дело с Yii.maleks писал(а): ↑2017.03.14, 10:15Как тогда вы бы переделали этот пример?rugabarbo писал(а): ↑2017.03.13, 18:50 Я вообще не представляю, какие железные нервы надо иметь, чтобы такие вещи рефакторить: viewtopic.php?t=16786 – поэтому в проектах сделанных на Yii у меня никогда не бывает сценариев и правил валидации в AR.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Почему в Yii2 есть валидаторы на mongoid, json
Программирование и архитектура/строительство далеко не тождественны, так что аналогия не уместна.Представим, что мы строим дом вместо разработки ПО, а архитектура ПО это фундамент. Если его плохо заложить, то со временем дом придет в негодность и поможет только постройка нового дома.
Да, можно и написать. Где именно уместней будет?Кстати, чаще всего форма отличается по данным от БД, а не совпадает с ней (кроме приложений-блогов, и то там даты). Может реально рекомендацию напишиете, что нужно разделять?
Ну и про формат я немного не согласен. Прозрачное приведение типа или формата в обе стороны — это вполне себе часть модели. Например, прозрачное получение и запись в атрибут JSON, когда хранится это дело на самом деле в строке.
Нравится Yii? Давайте сделаем его лучше!.
Re: Почему в Yii2 есть валидаторы на mongoid, json
Т.е. в этом примере у вас будут следующие классы форм - UserRegistrationForm, UserUpdateByAdminForm, UserUpdateByModeratorForm, UserChangeEmailForm, UserChangePasswordForm с дублирующимися в каждой одними и теми же правилами?
Re: Почему в Yii2 есть валидаторы на mongoid, json
Именно. Моя практика показывает, что дублируются не наборы правил, а сами правила, поэтому правила валидации я выношу в отдельные валидаторы и повторно их использую.
Стараться избежать дублирования самих наборов правил – это псведооптимизация. Это не то дублирование кода, которого нужно избегать.
Re: Почему в Yii2 есть валидаторы на mongoid, json
Например, пользователя можем добавить из админки, а с другой стороны может добавиться он сам посредством регистрации на фронтенде. И в том и в другом случае нужно будет убедиться, что мейл ещё не занят. Мы создаём /common/components/validators/EmailUniquenessValidator и используем его среди правил валидации в любом Form-классе (как на фронте, так и на бэке).
Re: Почему в Yii2 есть валидаторы на mongoid, json
Если по разным моделям будут раскиданы копии правила - [['somefield'], 'string', 'max' => 255], и чтобы это число изменить надо "вспомнить" все такие модели, то для меня это то дублирование, которого я бы хотел избежать
Re: Почему в Yii2 есть валидаторы на mongoid, json
Если поля формы заполняются лишь в одном месте, я прописываю именно так.
Если же это какой-нибудь мейл или другое часто-используемое поле, я создаю EmailLengthValidator. Это не сложно, а неймспейсы помогают разложить все валидаторы по полочкам.
Re: Почему в Yii2 есть валидаторы на mongoid, json
А вообще, помнится, в старые добрые времена, когда я ещё писал на plain PHP (лет 12 назад), не было вообще никаких standalone-валидаторов и классов форм, а ввод проверялся обычным php-кодом. Работал в веб-студиях и геймдеве, проекты шли конвейером один за другим. Код переносился из проекта в проект обычным копированием, никаких композеров и в помине не было. И подобные магические числа (255) были раскиданы по всему коду. Конечно, сейчас я уже понимаю, что это был говнокод. Но могу с уверенностью сказать следующее:
1. Искать эти магические числа приходилось один раз в пятилетку и это не было проблемой.
2. Временные затраты на поиск и замену таких чисел были гораздо ниже временных затрат, которые мы испытали бы на написание standalone-сервисов, валидаторов и прочего подобного.
Поэтому мне кажется, что фраза "мне придётся вспомнить ВСЕ такие модели" выражает лишь некий гипертрофированный страх от потенциально-возможной работы, которую вам делать не придётся. А если придётся, вы это сделаете поиском по коду за 5 минут.
1. Искать эти магические числа приходилось один раз в пятилетку и это не было проблемой.
2. Временные затраты на поиск и замену таких чисел были гораздо ниже временных затрат, которые мы испытали бы на написание standalone-сервисов, валидаторов и прочего подобного.
Поэтому мне кажется, что фраза "мне придётся вспомнить ВСЕ такие модели" выражает лишь некий гипертрофированный страх от потенциально-возможной работы, которую вам делать не придётся. А если придётся, вы это сделаете поиском по коду за 5 минут.
Re: Почему в Yii2 есть валидаторы на mongoid, json
Т.е на емаил с длиной 30 у вас будет один свой валидатор-обертка над емаил валидатором с захардкоденной проверкой на 30.
И так для всех таких проверок со св-вами.
Сначала пошла куча классов форм, теперь к ним добавились куча классов валидаторов, это уже целая методика, у которой как бы тоже не достает ни обоснования ни удобства.
В yii системно учат что сущность сама хранит свои правила валидации. (А AR модели - это тоже сущности, просто которые еще знают как себя сохранить в permanent storage )
Если вы эти правила валидации из сущности вынимаете и переносите во вспомогательные модели, такие как формы, то такой подход требует подробного разбирательства. Рецепты там, статьи, со всеми подноготными, т.к. вот эти костылики с классами захардкоденных валидаторов как по мне выглядят совсем не ахти
Re: Почему в Yii2 есть валидаторы на mongoid, json
Я никому не навязываю. Хотите клиентскую валидацию держать внутри ORM - дело ваше. Я лишь изложил результаты собственного опыта.
Re: Почему в Yii2 есть валидаторы на mongoid, json
К тому же я не отступал от Yii. В изложенной мной практике нет самописов. Я просто использую Yii иначе. Вам же почему-то показалось, что я изложил новую методику. Странно, неправда ли? (:
Re: Почему в Yii2 есть валидаторы на mongoid, json
А что сложного?
Код: Выделить всё
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()],
]
}
}
Со своим собственным EmailValidator мы и от фреймворка абстрагировались, и внешнюю связанность уменьшили, и тестируемость повысили. Надо будет поменять текст ошибки на всём сайте - переопределим $message:
Код: Выделить всё
class EmailValidator extends \yii\validator\EmailValidator
{
public $message = '...';
}
Этот лимит 255 основан на VARCHAR из БД. Он не меняется никогда.
Эта методика необоснована и неудобна только CRUD-кодерам, не заморачивающихся с Task Based UI и бизнес-требованиями.
Да, системно учат неподерживаемому нетестируемому непереносимому database-first Yii-коду, где AR является не только строкой из базы, но и одновременно псевдосущностью, формой, валидатором ввода, хелпером, хранилищем файлов, рассыльщиком писем, ресурсом для API и моделью отображения.
А ещё сущности можно делать полноценными объектами с внутренним состоянием и инкапсулированным поведением, проверяющим все бизнес-требования. Для программирования именно code-first объектами, а не строками из базы. С разделением на интерфейс, бизнес-модель и инфраструктуру. Для моделирования процессов реального мира без заморочек с форматами полей в БД. С чётким разделением на обязанности. Эта методика называется "объектно-ориентированным программированием", с CRUD и AR имеющим мало чего общего.
P.S. Перенесите тему в раздел "Архитектура".
Последний раз редактировалось ElisDN 2017.03.14, 16:05, всего редактировалось 8 раз.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Почему в Yii2 есть валидаторы на mongoid, json
Перенёс.
Так-то да, AR — он на то и AR чтобы быстро что-то сфигачить и крудов наделать. В реально сложных проектах без нормального абстрагированного от всего слоя или слоёв обойтись тяжело. Но до сложных проектов дорастает, в лучшем случае, 10% всего запускаемого.
Так-то да, AR — он на то и AR чтобы быстро что-то сфигачить и крудов наделать. В реально сложных проектах без нормального абстрагированного от всего слоя или слоёв обойтись тяжело. Но до сложных проектов дорастает, в лучшем случае, 10% всего запускаемого.
Нравится Yii? Давайте сделаем его лучше!.
Re: Почему в Yii2 есть валидаторы на mongoid, json
Понять, в какую сторону и как быстро будет расти проект, чтобы не переусердствовать с запасом гибкости - это и есть сложнейшая задача разработки. В каждом проекте золотая середина своя. Более того, по мере развития проекта она может меняться. Соответственно все эти споры в отвязке от состояния реального проекта не имеют смысла. У меня такой опыт и такие проекты, на них держать standalone-валидаторы выгодно, у вас могли быть другие проекты и другие расклады.
Re: Почему в Yii2 есть валидаторы на mongoid, json
А второй использует еще совсем по иначе, третий еще иначее. И имеем , вроде оно на фреймворке, но уже и не совсем, насколько такой код остается поддерживаемым сообществом... когда нет даже ни одной ссылки на подобный рецепт.
Т.е. ваша методика заключается в полном отказе от AR ?, что с помощью нее ничего не проектировать, а только может для доступа к базе чтобы выбирать данные? Все равно что позакрывать ей методы ->load, ->rules. Чем это не "новая методика" по сравнению с тем что официально предлагают всем делать в доках?
Re: Почему в Yii2 есть валидаторы на mongoid, json
Я не против того как вы выкручиваетесь в этих случаях, думал просто может первому, примитивному(что по ссылке), варианту у вас имеются какие и получше варианты, но раз только такие, то ладно.ElisDN писал(а):А что сложного?
А в реале будутElisDN писал(а):class UserProfileEditForm
AdminCreateSimpleUserForm
ModeratorCreateSimpleUserForm
UserProfileEditForm
ModeratorEditOwnProfileForm
AdminEditOwnProfileForm
AdminEditSimpleUser
AdminEditModeratorUser
ModeratorEditOtherModeratorProfileForm
....
Одним св-вом или правилом отличные, они будут по сути содержать огромный дубляж, перетасовку, своей начинки,
а такими количествами, да и для всего вокруг, боюсь как чалму бы не пришлось завязывать из всего этого.
Последний раз редактировалось maleks 2017.03.14, 18:24, всего редактировалось 1 раз.
Re: Почему в Yii2 есть валидаторы на mongoid, json
http://www.yiiframework.com/doc-2.0/gui ... validators – как видите, я всё делаю по докам. Вы стали жертвой заманчивых возможностей Yii по размещению всего и вся внутри ActiveRecord. Но это лишь возможности, а не обязательное требование ко всем.maleks писал(а): ↑2017.03.14, 17:46А второй использует еще совсем по иначе, третий еще иначее. И имеем , вроде оно на фреймворке, но уже и не совсем, насколько такой код остается поддерживаемым сообществом... когда нет даже ни одной ссылки на подобный рецепт.
Т.е. ваша методика заключается в полном отказе от AR ?, что с помощью нее ничего не проектировать, а только может для доступа к базе чтобы выбирать данные? Все равно что позакрывать ей методы ->load, ->rules. Чем это не "новая методика" по сравнению с тем что официально предлагают всем делать в доках?
Re: Почему в Yii2 есть валидаторы на mongoid, json
Чет вы в вашем примере скромно о attributeLabels() промолчали, не используете?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; ... }
Re: Почему в Yii2 есть валидаторы на mongoid, json
Ну и причем тут standalone-validators, если речь идет о вашем рецепте с AR (рулесы у них не использовать, да и походу их вообще не использовать).rugabarbo писал(а): ↑2017.03.14, 18:20 http://www.yiiframework.com/doc-2.0/gui ... validators – как видите, я всё делаю по докам. Вы стали жертвой заманчивых возможностей Yii по размещению всего и вся внутри ActiveRecord. Но это лишь возможности, а не обязательное требование ко всем.
Насчет "всего и вся внутри ActiveRecord" - это уже ваши домыслы, я о таком не говорил.
Но о том что есть непосредственная связь между объектами предметной области и хранящимися в БД данными, идее эксплуатируемой AR, есть док-ва и помимо мира yii, те же ER-модели. В БД лежат сущности, но почему бы им не стать программными сущностями.