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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy