Класс extpoint\yii2\base\Model
наследуется от yii\db\ActiveRecord
и не меняет интерфейс класса.
Поэтому его легко можно использовать вместо ActiveRecord
. Ниже описаны добавленные возможности.
Обычно в приложении почти у каждой сущности можно выделить поле, отвечающее за ее "заголовок".
Это username
у пользователя, title
у статьи или новости, id + date
у лицензии и так далее.
Аналогично у сущностей есть одна или несколько страниц для отображения детальной информации о ней
(профиль пользователя, страница новости, подробности по лицензии).
Чтобы указать какое поле используется в качестве заголовка, добавлен метод getModelLabel()
, который по-умолчанию
пытается найти поля title
, label
, name
для отображения. Если их нет - выводит идентификатор: #23
.
Пример использования:
/**
* @return string
*/
public function getModelLabel() {
return $this->title;
}
Для указания ссылок на страницу описания сущности необходимо переопределить метод getModelLinks($user)
,
который будет возвращать массив ссылок или роутов.
При отображении ссылки на сущеность, будет последовательно ссылки проверяться
на доступность пользователю (проверка прав по MegaMenu
) до тех пор, пока не найдется подходящая.
Исходя из этого, менее доступные ссылки (администраторские) лучше указывать в начале списка.
В аргументе $user
передается модель пользователя, позволяющая более контекстно выбрать подходящую ссылку.
Пример использования:
/**
* @param Model|null $user
* @return array
*/
public function getModelLinks($user) {
return [
['/game/admin/game-manage/view', 'gameId' => $this->id],
['/game/game/view', 'gameId' => $this->id],
];
}
Этот статичный метод возвращает имя переменной, использующейся в роутах для указания идентификатора сущности.
Обычно мы всегда используем имя id
для указания параметра, однако когда в роуте нужно указать несколько идентификаторов,
то имя id
уже становится не понятным и требует рефакторинга (id
-> gameId
).
Важно! Поэтому лучше всегда указывать имена переменных, содержащие имя сущности.
Не верно:
['/game/game/view', 'id' => $this->id],
Правильно:
['/game/game/view', 'gameId' => $this->id],
По-умолчанию метод Model::getRequestParamName()
возвращает lcfirst()
от имени модели + Id
.
Т.е. для модели LicenseOrder
будет возвращено имя licenseOrderId
.
В методе базовой модели Model::transactions()
изменено поведение по-умолчанию. Транзакционное сохранение используется
для всех операций создания и сохранения сущности. Данное изменение было сделано как наиболее часто используемое в проектах.
public function transactions()
{
return [
self::SCENARIO_DEFAULT => self::OP_ALL,
];
}
В базовую модель yii2-core
добавлены вспомогательные методы для поиска, сохранения и удаления сущности, которые в
случае неуспеха возвращают исключение. Таким образом, не нужно каждый раз проверять результат сохранения или поиска сущности.
Было:
$model = MyModel::findOne($myId);
if (!$model) {
throw new NotFoundHttpException('Запись не найдена');
}
Стало
$model = MyModel::findOrPanic($myId);
Используется в случаях, когда по бизнес логике модель однозначно должна сохраниться и все данные пользователя уже проверены.
Было:
if (!$model->save()) {
throw new Exception();
}
Стало
$model->saveOrPanic();
Было:
if (!$model->delete()) {
throw new Exception();
}
Стало
$model->deleteOrPanic();