Задать вопрос

Как и в каких случаях использовать DI в Yii2?

Многие ругают yii за статику и большую связанность, на не больших проектах это не сильно страшно, но иногда выходит боков.

Вопрос такой, как правильно использовать DI в yii2, а именно хочу понять и рассмотреть классический пример, когда нужно из 1 модуля обращаться к моделе другого модуля.

Есть доки:
https://github.com/yiisoft/yii2/blob/master/docs/g...

Все здорово, но я ранее не работал с этой штукой и не понятно где и когда нужно передавать зависимости.

Ну например есть модуль статей, статьи пишут пользователи, при добавлении статьи мне необходимо пошаманить с автором, тоесть получить модуль пользователя в моделе статей.

Сейчас я на прямую подключаю модель пользователей и работаю с ней в моделе статей. Это 2 разных модуля и появляется ощущение дискомфорта.

Объясните пожалуйста (очень желательно с примерами кода) как в таких случаях использовать DI в yii2 (где внедрять зависимости) ?
  • Вопрос задан
  • 12041 просмотр
Подписаться 22 Сложный Комментировать
Решения вопроса 1
SamDark
@SamDark
Yii2 core team
DI именно в вашем случае не при чём. Это способ реализации, а не сама идея. Идея состоит в том, что вам нужно реализовать принцип инверсии зависимостей. То есть начать работать с интерфейсами, а не с конкретными реализациями.

Чтобы быть универсальным и переносимым, модуль не должен знать о моделях извне себя. Вместо этого он должен выражать свои требования в виде интерфейса, а внешние модели этот интерфейс должны реализовывать.

Для вашего примера делаем в модуле Article делаем интерфейсы:

interface ArticleInterface
{
    public function getTitle();
    public function getAuthor();
}

interface ArticleAuthorInterface
{
    public function getName();
    public function getID();
}


Далее в пределах модуля используем только интерфейсы, а не сами модели:

public function renderArticle(ArticleInterface $article)
{
    return $this->renderPartial('_article', [
         'author' => $article->getAuthor(), 
         'title' => $article->getTitle()
    ]);
}


Вне модуля нам придётся реализовать интерфейсы в моделях:

class Article extends ActiveRecord implements ArticleInterface
{
   // ...
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы