Skip to content

Latest commit

 

History

History
149 lines (104 loc) · 5.67 KB

model.md

File metadata and controls

149 lines (104 loc) · 5.67 KB

Models

Класс extpoint\yii2\base\Model наследуется от yii\db\ActiveRecord и не меняет интерфейс класса. Поэтому его легко можно использовать вместо ActiveRecord. Ниже описаны добавленные возможности.

Отображение по-умолчанию

Обычно в приложении почти у каждой сущности можно выделить поле, отвечающее за ее "заголовок". Это username у пользователя, title у статьи или новости, id + date у лицензии и так далее. Аналогично у сущностей есть одна или несколько страниц для отображения детальной информации о ней (профиль пользователя, страница новости, подробности по лицензии).

Model::getModelLabel()

Чтобы указать какое поле используется в качестве заголовка, добавлен метод getModelLabel(), который по-умолчанию пытается найти поля title, label, name для отображения. Если их нет - выводит идентификатор: #23.

Пример использования:

/**
 * @return string
 */
public function getModelLabel() {
    return $this->title;
}

Model::getModelLinks($user)

Для указания ссылок на страницу описания сущности необходимо переопределить метод 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],
    ];
}

Model::getRequestParamName()

Этот статичный метод возвращает имя переменной, использующейся в роутах для указания идентификатора сущности. Обычно мы всегда используем имя 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::findOrPanic($condition)

Было:

$model = MyModel::findOne($myId);
if (!$model) {
    throw new NotFoundHttpException('Запись не найдена');
}

Стало

$model = MyModel::findOrPanic($myId);

Model::saveOrPanic($attributeNames = null)

Используется в случаях, когда по бизнес логике модель однозначно должна сохраниться и все данные пользователя уже проверены.

Было:

if (!$model->save()) {
    throw new Exception();
}

Стало

$model->saveOrPanic();

Model::deleteOrPanic()

Было:

if (!$model->delete()) {
    throw new Exception();
}

Стало

$model->deleteOrPanic();