Skip to content

Commit 9ddc283

Browse files
committed
Added remark of inheritance AR
1 parent 5fd2752 commit 9ddc283

File tree

1 file changed

+44
-9
lines changed

1 file changed

+44
-9
lines changed

scripts/steps/step-000.4.md

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,52 @@ TODO: https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/security-authent
5151

5252
Теперь давайте вернёмся к форме "Опрос". Для работы с формой в клиентской части(далее frontend) мы использовали
5353
Active Record модель `Interview`, которая описывала форму. Т.к. эта модель описана в frontend, то в backend
54-
она не доступна. Чтобы исправить это, необходимо модель расположить в общей директории - `common/models/`.
55-
Необходимо скопировать файл `Interview.php` из `frontend/models` в `common/models/`. Это уже сделано.
54+
к ней можно обратиться как `frontend/models/Interview` - что не совсем корректно.
55+
Чтобы исправить это, необходимо модель расположить в общей директории - `common/models/`.
56+
Необходимо переместить файл `Interview.php` из `frontend/models` в `common/models/`. Это уже сделано.
5657

57-
Вам осталось изменить файлы следующим образом. В common модели изменим пространство имени, удалим свойство "проверочный
58-
код", удалим правила, так как это всё требуется на стороне frontend части. А в frontend модели изменить
59-
родительский класс с `\yii\db\ActiveRecord` на `\common\models\Interview` и удалите методы `tableName()` и `attributeLabels()`.
58+
Вам осталось изменить файлы, зависимые от этой модели, следующим образом:
6059

61-
Теперь, когда все изменения внесены, в backend возможно использовать модель `\common\models\Interview`. Создадим вид,
62-
в котором будут отображаться все записи из таблицы "Опросов". Чтобы облегчить выполнение этой задачи,
60+
- в common модели `yii2-app-advanced/common/models/Interview.php` изменить пространство имени класса.
61+
62+
- поменять в `frontend/controllers/SiteControllers.php` в методе `actionInterview()` пространство имени для этой модели
63+
с `frontend/models/Interview` на `common/models/Interview`.
64+
65+
- поменять в виде `yii2-app-advanced/frontend/views/site/interview.php` пространство имени, также как в предыдущем случае.
66+
67+
- удалить файл `yii2-app-advanced/frontend/models/Interview.php`
68+
69+
Теперь, когда все изменения внесены, в backend и frontend возможно использовать единую AR модель - `\common\models\Interview`.
70+
71+
<p class="alert alert-info">
72+
Для того, чтобы избежать такой ситуации в будущем, лучше сразу генерировать все модели Active Record в "common/models".
73+
</p>
74+
75+
#### Важный момент: Разделение моделей Active Record
76+
77+
Очень часто, модель Active Record разбивается на два, три класса, т.е. `\common\models\Interview` и её наследники
78+
`\frontend\models\Interview` и `\backend\models\Interview`. Сперва это кажется логичным и правильным. Но такое разделение
79+
влечёт за собой скрытые проблемы. Возможно в большинстве случаев вы даже не столкнётесь с этими проблемами, но они существуют.
80+
Вот некоторые из них:
81+
82+
- может возвратиться некорректная связь с другими разделёнными моделями, вместо ожидаемой `backend/models/Interview`
83+
вам будет доступна только `common/models/Interview` и будет сложно исправить сложившеюся ситуацию.
84+
85+
- изменения общей модели, может оказать негативное влияние на работу модели из другого модельного слоя (frontend, backend).
86+
Такое на практике встречается очень часто, после правок в общей - ломается что-то критичное на backend.
87+
88+
- проблемы с перекрытием событий: beforeValidate. Выливается в проблемы с перекрытием сценариев при валидации.
89+
Придётся создавать "костыльный" код `return Model::scenarios();`
90+
91+
Единственным плюсом от разделения это не нужно дублировать атрибуты модели, для остальных моделей, которые обрабатывают AR.
92+
Но этот плюс теряется за кучей недостатков. В общем постарайтесь придерживаться логики , что модельный слой (Active Record)
93+
должен быть единым для разных частей приложения (backend, frontend, rest и т.д.). Поэтому работая с yii2-advanced располагайте
94+
все Active Record модели в `common/models/`. Или создавайте отдельные для frontend и backend, если уж логика настолька
95+
различна и её нужно разделить.
96+
97+
#### Виджет GridView
98+
99+
Создадим вид, в котором будут отображаться все записи из таблицы "Опросов". Чтобы облегчить выполнение этой задачи,
63100
<a href="/yii2-app-advanced/backend/web/index.php?r=gii" target="_blank">обратимся к Gii</a>.
64101
Выберите генератор "CRUD Generator", который генерирует виды и контроллер на основании модели. Введите в Model Class
65102
`common\models\Interview`, а в Controller Class - `backend\controllers\InterviewController`. Всё, жмите Preview.
@@ -70,8 +107,6 @@ Active Record модель `Interview`, которая описывала фор
70107
Нажимаем "Generate" и наслаждаемся <a href="/yii2-app-advanced/backend/web/index.php?r=interview" target="_blank">
71108
результатами работы</a>.
72109

73-
#### Виджет GridView
74-
75110
Очень часто необходимо вывести данные в виде таблицы. Для решения этой задачи в Yii имеется сверхмощный виджет
76111
<a href="http://www.yiiframework.com/doc-2.0/yii-grid-gridview.html" target="_blank">yii\grid\GridView</a>. Разрабатывая
77112
административный раздел сайта, практически всегда этот виджет будет полезен. Вот и сейчас в виде

0 commit comments

Comments
 (0)