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()." (с)