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

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

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

Сообщение rugabarbo »

maleks писал(а): 2017.03.14, 18:35
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 написано, что "рулесы" в ActiveRecord нужно использовать? Обращаю внимание, что именно "нужно", а не "можно". Дайте ссылку, пожалуйста.

Использование форм с валидаторами тоже находится в пределах гайдов: http://www.yiiframework.com/doc-2.0/gui ... activeform – почему я не могу использовать этот подход для своих проектов?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

Всё верно. В гайдах, в основном, описываются возможности, а как именно делать каждый выбирает сам.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN »

maleks писал(а): 2017.03.14, 18:06 А в реале будут

AdminCreateSimpleUserForm
ModeratorCreateSimpleUserForm
UserProfileEditForm
ModeratorEditOwnProfileForm
AdminEditOwnProfileForm
AdminEditSimpleUser
AdminEditModeratorUser
ModeratorEditOtherModeratorProfileForm
...

Одним св-вом или правилом отличные, они будут по сути содержать огромный дубляж, перетасовку, своей начинки, а такими количествами, да и для всего вокруг, боюсь как чeму бы не пришлось завязывать из всего этого. :)
А у Вас вместо этого будут:

const ScenraioAdminCreateSimpleUserForm
const ScenraioModeratorCreateSimpleUserForm
const ScenraioUserProfileEditForm
const ScenraioModeratorEditOwnProfileForm
const ScenraioAdminEditOwnProfileForm
const ScenraioAdminEditSimpleUser
const ScenraioAdminEditModeratorUser
const ScenraioModeratorEditOtherModeratorProfileForm
...

Одним св-вом или правилом отличные и с жуткой вакханалией в rules().

А от дубляжа наследование легко избавляет:

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

class PostEditForm extends PostCreateForm {

}
maleks писал(а): 2017.03.14, 18:06 Чет вы в вашем примере скромно о attributeLabels() промолчали, не используете?
Использую:

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

public function attributeLabels() {
    return ArrayHelper::merge((new User())->attributeLabels(), [
        'captcha' => 'Проверочный код',
        'agree' => 'Я согласен',
    ]);
}
maleks писал(а): 2017.03.14, 18:06 ...когда нет даже ни одной ссылки на подобный рецепт.
Есть. Просто не все это читают.
maleks писал(а): 2017.03.14, 18:06 Насчет "всего и вся внутри ActiveRecord" - это уже ваши домыслы, я о таком не говорил.
Это не домыслы. AR в Yii - это строка из базы, форма с валидацией, ресурс для API и модель отображения.
maleks писал(а): 2017.03.14, 18:06 А второй использует еще совсем по иначе, третий еще иначее... Чем это не "новая методика" по сравнению с тем что официально предлагают всем делать в доках?
Да-да. Вот так лапшекодишь пятьсот лет на Битриксе или на Yii, а потом случайно узнаёшь на форуме, что в мире ещё и другие методики и фреймворки существуют.
maleks писал(а): 2017.03.14, 18:06 Ну и причем тут standalone-validators, если речь идет о вашем рецепте с AR (рулесы у них не использовать, да и походу их вообще не использовать)
...
Т.е. ваша методика заключается в полном отказе от AR?, что с помощью нее ничего не проектировать, а только может для доступа к базе чтобы выбирать данные? Все равно что позакрывать ей методы ->load, ->rules.
Если у нас "сущность" является просто набором полей, которые мы только создаём и редактируем, то удобен CRUD на AR с load(), rules(), fields() в одной куче. Если же появляется любая витиеватая логика обработки полей вроде "при отмене заказа поле причины отказа должно быть обязательным", "при изменении email нужно сгенерировать токен подтверждения", то мгновенно получаем кучи if-ов в beforeSave() и кучи when в rules().
maleks писал(а): 2017.03.14, 18:06 Но о том что есть непосредственная связь между объектами предметной области и хранящимися в БД данными, идее эксплуатируемой AR, есть док-ва и помимо мира yii, те же ER-модели. В БД лежат сущности, но почему бы им не стать программными сущностями.
ERM - это модель данных. В БД лежат не сущности, а наборы данных. А сущности - это объекты модели предметной области. Но только в примитивных случаях структура полей объекта совпадает со структурой данных в базе, где AR успешно транслирует их один-в-один. Если же возникают отличия, то AR становится неудобной.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

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

Сообщение sda »

Если следовать гайду, то в итоге гарантированно будет спагетти код. Все что видел на Yii так и написано. Печально, что в доках нет никаких отсылок, что читать, чтобы сделать иначе. Кажется, фреймворк должен только помогать прокрутить доменную модель через http или иной протокол, а остальное (валидация, di контейнер, логгер и прочая инфраструктура) дособрать из независимых компонентов, кому что нужно. В node.js mvc фреймворки типа yii вообще не взлетают. Фронтенд уже несколько лет движется в сторону веб компонентов. В php это как-то пока не очень популярно несмотря на то, что есть достойные фреймворки типа slim, хоть и немного избыточны, в сравнении с express/koa или socket.io для http и websocket соответственно из node.js
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

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

Сообщение anton_z »

samdark писал(а): 2017.03.14, 10:32 Да, можно и написать. Где именно уместней будет?
http://www.yiiframework.com/doc-2.0/gui ... forms.html

После этого предложения:

The model can be either based upon an Active Record class, representing some data from the database, or a generic Model class (extending from yii\base\Model) to capture arbitrary input, for example a login form.

Предлагаю добавить:

If a form data structure or a format differs from the database representation, the form model and the row in the database should be represented by different classes.

Было бы классно.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

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

Сообщение maleks »

rugabarbo писал(а): 2017.03.14, 18:43 Где в гайдах Yii2 написано, что "рулесы" в ActiveRecord нужно использовать? Обращаю внимание, что именно "нужно", а не "можно". Дайте ссылку, пожалуйста.
AR генерируется уже с рулесами, по структуре таблицы. Чтобы убрать их нужен какой то серьезный аргумент, иначе эту ORM невозможно будет использовать для записи данных в базу, а к св-вам полей доступ открыт всем.

Ваш метод мне чем то напомнил старый добрый Delphi. Есть любая форма?, создается под нее класс, накидывается туда инпутов разных, обработчики пишутся и готово. Такая себе форма-ориентированная разработка. С упором на V в MVC. А так как V как раз самая изменчивая, то и выходит что куча похожего кода чтобы охватить вариации.
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

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

Сообщение rugabarbo »

maleks писал(а): 2017.03.15, 08:32
rugabarbo писал(а): 2017.03.14, 18:43 Где в гайдах Yii2 написано, что "рулесы" в ActiveRecord нужно использовать? Обращаю внимание, что именно "нужно", а не "можно". Дайте ссылку, пожалуйста.
AR генерируется уже с рулесами, по структуре таблицы. Чтобы убрать их нужен какой то серьезный аргумент, иначе эту ORM невозможно будет использовать для записи данных в базу, а к св-вам полей доступ открыт всем.
Давно не пользуюсь генераторами кода (за исключением миграций), а когда пользовался - перетачивал шаблоны генерации под себя. Потом надоело их корректировать под свои нужды и я просто выкинул GII из зависимостей как оверхед.

AR и без "рулесов" отлично всё сохраняет в базу.
maleks писал(а): 2017.03.15, 08:32Ваш метод мне чем то напомнил старый добрый Delphi. Есть любая форма?, создается под нее класс, накидывается туда инпутов разных, обработчики пишутся и готово. Такая себе форма-ориентированная разработка. С упором на V в MVC. А так как V как раз самая изменчивая, то и выходит что куча похожего кода чтобы охватить вариации.
Вы опять же стали жертвой генерируемого кода и распространённых (но не лучших практик). Да, многие так и делали в университете для своих "калькуляторов" - перетаскивали кучу всего мышкой на форму и накидывали обработчики, потому что так проще.

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

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

Сообщение samdark »

Добавил: https://github.com/yiisoft/yii2/commit/ ... 91e121f386

Если ещё где-то уместно в гайде, говорите.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

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

Сообщение maleks »

rugabarbo писал(а): 2017.03.15, 09:28 Давно не пользуюсь генераторами кода (за исключением миграций), а когда пользовался - перетачивал шаблоны генерации под себя. Потом надоело их корректировать под свои нужды и я просто выкинул GII из зависимостей как оверхед.

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

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

Сообщение rugabarbo »

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

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

Сообщение maleks »

ElisDN писал(а):А от дубляжа наследование легко избавляет:

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

class PostEditForm extends PostCreateForm {

}
Это вас не спасет, т.к.:
1) нарушает последовательность итеративного процесса. Есть сначала форма со многими полями, теперь нужно с меньшими, уже не отнаследуешь, а править иерархию - нарушаем OCP
2) даже если по полям идет добавление, то теперь с рулесами заморока. Хранятся то они всей кучей в сыром массиве, в котором причем важен порядок. Поэтому найти и идентифицировать некий рулес из сырого множества, его поменять, или вставить/удалить другой, все это будет жестко зависить от изменений в базовой модели и сломается на раз, потому что:
3) эти формы различаются поведением и поэтому в большинстве случаев не находятся в отношении is a, и делая так вы нарушаете LSP

ElisDN писал(а):Использую:

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

public function attributeLabels() {
    return ArrayHelper::merge((new User())->attributeLabels(), [
        'captcha' => 'Проверочный код',
        'agree' => 'Я согласен',
    ]);
}
Ну вот, тут вы создали жесткую зависимость и делегировали получение этой инфы от сущности, а в случае с рулесами, вы так не захотели сделать, где система?

Ваш валидатор

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

class PhoneValidator extends \yii\validators\RegularExpressionValidator 
{
    public $pattern = '/dddddddddd/iu';
}
То же не остается без вопросов. Вы в него захардкодили строку, сделали от него зависимость, а он то OCP нарушает, т.к. требует изменения кода при изменении поведения. Где гарантии что он не используется многократно формами для разных сущностей.
ElisDN писал(а): А у Вас вместо этого будут:

const ScenraioAdminCreateSimpleUserForm
const ScenraioModeratorCreateSimpleUserForm
const ScenraioUserProfileEditForm
const ScenraioModeratorEditOwnProfileForm
const ScenraioAdminEditOwnProfileForm
const ScenraioAdminEditSimpleUser
const ScenraioAdminEditModeratorUser
const ScenraioModeratorEditOtherModeratorProfileForm
...

Одним св-вом или правилом отличные и с жуткой вакханалией в rules().
Я где то говорил, что я агитирую за этот вариант?
Он является базовым примитивным, которым многие и правда делают, но цель то была узнать есть ли варианты получше.
Я например эти сценарии почти не использую, т.к. в модели можно выставить только один сценарий, что как раз ведет к таким кодам.
ElisDN писал(а): Если же появляется любая витиеватая логика обработки полей вроде "при отмене заказа поле причины отказа должно быть обязательным",
Что у нас в этом случае появляется, новое поведение? В yii что поведений нет, чтобы не "получать кучи if-ов в beforeSave() и кучи when в rules()." (с)
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

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

Сообщение maleks »

rugabarbo писал(а): 2017.03.15, 11:41 maleks, я не вижу для себя сколько-нибудь ценной дальнейшую дискуссию с вами. Извините...
ну ответов то у вас как не было так и нет, так что какое там общение, чисто мне была практика в терпении, когда вы невпопад то ссыль на классы валидаторов кидаете, то про gii что то скажете....
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

Так, не ругаться! Мы тут чтобы опытом делиться и мыслями, а не чтобы кому-то доказывать, чей подход круче.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN »

maleks писал(а): 2017.03.15, 11:55 нарушает последовательность итеративного процесса.
Тогда не наследуемся.
maleks писал(а): 2017.03.15, 11:55 Ну вот, тут вы создали жесткую зависимость и делегировали получение этой инфы от сущности, а в случае с рулесами, вы так не захотели сделать, где система?
Система в том, что attributeLabels() у всех одинаковые, а rules() разные.
maleks писал(а): 2017.03.15, 11:55 Вы в него захардкодили строку, сделали от него зависимость, а он то OCP нарушает, т.к. требует изменения кода при изменении поведения. Где гарантии что он не используется многократно формами для разных сущностей.
Для этого и захардкодил, чтобы использовать в разных формах разных сущностей.
maleks писал(а): 2017.03.15, 11:55 Я например эти сценарии почти не использую, т.к. в модели можно выставить только один сценарий, что как раз ведет к таким кодам.
нарушает последовательность итеративного процесса.
Тогда и таких форм у Вас не будет, раз таких сценариев нет.
maleks писал(а): 2017.03.15, 11:55 Что у нас в этом случае появляется, новое поведение? В yii что поведений нет, чтобы не "получать кучи if-ов в beforeSave() и кучи when в rules()." (с)
Я говорю про поведение объектов, а не про Behaviors в Yii. Это разные вещи.
И beforeSave() для логики не использую.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

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

Сообщение anton_z »

maleks писал(а): 2017.03.15, 11:27 Да что вы все про генераторы да генераторы, формы, формы и еще раз формы, я о них выше не разу не упоминал. Если есть какой то консольный скрипт импорта, то в нем также само надо будет наполнить модель и сохранить, а без рулесов у вас при любой помарке будет выкидывать DbErrorException
Разрешите поинтересоваться, а как вы делаете ввод дат на формах? Например у вас в БД дата в формате Y-m-d H:i:s, а на форме d.m.Y.

По мне так если рассматривать AR как бизнес-сущность (не отрываем б/логику от БД), в ней не должно быть помарок. Контроль за наличием помарок должен осуществляться в другом месте, до заливки данных в AR (это формы, их кстати никто не мешает использовать в консоли или REST, тем более что там данные могут приходить в форматах, отличных от БД).

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

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

Сообщение samdark »

Крайности плохи везде и всегда. Если ещё что-то найдёте, чем можно руководство дополнить, пишите.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

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

Сообщение anton_z »

samdark писал(а): 2017.03.16, 11:05 Крайности плохи везде и всегда. Если ещё что-то найдёте, чем можно руководство дополнить, пишите.
Не поспоришь. Я не обвиняю фреймворк. Тут виноваты разработчики проектов, не думающие об архитектуре и правильном выборе инструментов. За фреймворк надо спасибо сказать)
Matvik
Сообщения: 194
Зарегистрирован: 2013.06.21, 02:32

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

Сообщение Matvik »

Лично мне кажется, что использовать AR, как форму, допустимо в простых случаях, например, если у нас есть простой круд в админке (категории постов). В таком случае незачем городить отдельную модель для формы.
Другое дело, допустим, форма редактирования того же поста, где может быть много специфических полей и разных вариантов форм - тут уже нужно делать отдельные модели, чтоб не было ада со сценариями и разным количеством полей. Или хрестоматийный пример - таблица пользователей, и разные формы для её редактирования (регистрация, профиль, и т. д.).
Относительно же валидации в AR при использовании отдельных сущностей форм - чем плохо? Валидация просто строится относительно типов полей в бд, и служит дополнительной проверкой при изменении записей. А в формах уже валидаторы для конкретного случая.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

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

Сообщение maleks »

Matvik писал(а): 2017.04.27, 12:42 Лично мне кажется, что использовать AR, как форму, допустимо в простых случаях, например, если у нас есть простой круд в админке (категории постов). В таком случае незачем городить отдельную модель для формы.
Другое дело, допустим,
По этой теме вы этого не увидите, т.к. тут не отвечают на вопросы и например ни разу тут не был упомянут DDD, хотя подразумевают они его.
Довольно странный подход у форумчан кстати, вроде названия паттернов и технологий как раз и должны служить таким себе "ubiquitous language" между разработчиками.
Но нет, надо вырывать какие то куски из архитектуры, их обсасывать по отдельности, вводя других этим в заблуждение, когда другие думают что может у кого то есть какая толковая, но не DDD (с его по сути отказом от AR ), методика разработки на Yii.
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN »

Matvik писал(а): 2017.04.27, 12:42 Лично мне кажется, что использовать AR, как форму, допустимо в простых случаях, например, если у нас есть простой круд в админке (категории постов). В таком случае незачем городить отдельную модель для формы.
Да, для простого CRUD никакая архитектура не нужна. Да и самого приложения может не быть, если это только "обёртка над БД". Для этого хватит простого PhpMyAdmin или того же MS Access с кастомными видами и формами.
Matvik писал(а): 2017.04.27, 12:42 Другое дело, допустим, форма редактирования того же поста, где может быть много специфических полей и разных вариантов форм - тут уже нужно делать отдельные модели, чтоб не было ада со сценариями и разным количеством полей. Или хрестоматийный пример - таблица пользователей, и разные формы для её редактирования (регистрация, профиль, и т. д.).
Да, любое отступление от голого CRUD (в случае добавления специфической бизнес-логики) приводит к вопросу "куда этот if положить" и последующему аду при скыдивании этого всего наобум в контроллеры. И эти проверки желательно бы тестировать. Здесь и возникает необходимость в структуризации и начинается разделение кода, раскладывание логики сущностей в сущности (и их части), а логики дирижирования ими и всей прочей - в другие классы.
Matvik писал(а): 2017.04.27, 12:42 Относительно же валидации в AR при использовании отдельных сущностей форм - чем плохо? Валидация просто строится относительно типов полей в бд, и служит дополнительной проверкой при изменении записей. А в формах уже валидаторы для конкретного случая.
Если проверки типов оставить в AR, а в формы поместить все required, то нужно примешивать $form->addErrors($entity->getErrors()), если сущность не сохранилась. А так при разработке реальных ООП-шных сущностей у нас вообще нет публичных полей и сеттеров.
Последний раз редактировалось ElisDN 2017.04.27, 16:57, всего редактировалось 1 раз.
Ответить