В основном — мы используем популярные, устоявшиеся практики и принципы SOLID/GRASP. Если Вы знакомы с творчеством Дмитрия Елисеева по Yii2, а именно “Интенсив по ООП” и “Мастер-класс по разработке интернет-магазина на Yii2” — будет несложно.
<aside> ℹ️ В коде проекта сможете в живую увидеть описанные практики, если какие-то примеры не смогут раскрыть всю суть подхода.
</aside>
Навигация
Используется подход “фабричный метод”: мы просто помещаем код создания модели в статичный метод этой модели.
Это позволяет нам пере-использовать этот код, и чтобы он не мешал чтению в методах, где нужно создать сущность.
Пример:
/**
* This is the model class for table "chat_message".
*
* @property int $id
* @property int $author_id
* @property string $message
* @property int $date
*
* @property User $author
*/
class ChatMessage extends \\yii\\db\\ActiveRecord
{
public static function make($message, $authorId)
{
$entity = new static();
$entity->message = strip_tags($message)
$entity->author_id = $authorId;
$entity->date = time();
return $entity;
}
// ...
}
Создадим функцию для добавления сообщения в чат.
✅ Правильно:
public function addMessage(ChatMessageForm $form, $userId)
{
$message = ChatMessage::make($form->message, $userId);
$this->messages->add($message);
return $message;
}
❌ Неправильно:
public function addMessage(ChatMessageForm $form, $userId)
{
$message = new ChatMessage();
$message->message = strip_tags($form->message);
$message->author_id = $userId;
$message->date = time();
$this->messages->add($message);
return $message;
}
Некоторые вычисления/проверки/другую логику стоит скрывать в методах модели.
Допустим, мы хотим посчитать хватит ли пользователю баланса. Правильно будет создать метод isEnoughtBalance
в модели User
и после вызвать его для проверки.