В основном — мы используем популярные, устоявшиеся практики и принципы 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 и после вызвать его для проверки.