Как настроить в Yii DI?

У меня есть некий интерфейс. Есть некий, класс, который реализует его. При этом, класс наследуется от BaseObject. Это что то вроде сервиса с бизнес-логикой. Теперь, имея это, хочу заинжектить данную зависимость в конструкторе контроллера через интерфейс.

Смотрю в документацию и не понимаю, где мне этот конфиг писать. Просто кусок какого то кода. К чему он относится - непонятно. Это часть main конфига? Или мне надо отдельно файл создать? Если да, то Yii его "подхватит"? Непонятно.


Ответы (1 шт):

Автор решения: Aleksej_Shherbak

Мммда, короче сдыхает этот юии. Никому он не нужен. Такой простой вопрос - как заинжектить зависимость через интерфейс и ноль реакции. Отвечу сам. Ответ таков:

  1. Создаем файл di.php например. в нем пишем все, согласно документации.

Примерно так у меня выглядит этот файл:

<?php

Yii::$container->setSingleton('тут неймспейс моего интерфейса',
    [
        'class' => 'а здесь неймспейс класса, его реализующего',
        'prop1' => 'value 1',
        'prop2' => 'value 2',
    ]);

, где propr1 и prop2 - это сетеры в нашем компоненте. Yii транслирует имя сетера. То есть, было setName, а обращаться можно $obj->name. Потому полное имя писать не нужно при конфигурации. Важно, чтоб ваш компонента наследовал хотя бы BaseObject. А то "магия" сетеров работать не будет.

  1. Ну и дальше в контроллере в конструкторе просто объявляете, зависимость от этого интерфейса
/**
* @var MyLolKekInterface $myLolKekService
**/ 
private $myLolKekService;

function __construct(MyLolKekInterface $myLolKekService) {
    $this->myLolKekService = $myLolKekService;
} 
  1. Не забидьте подключить файл в стартовый скрипт (yii.php). В корне лежит. После всех бутстрапов я так полагаю.
→ Ссылка