@para_noir_in_my_box

Как в Yii2 организовать Dependency Injection с вызовом метода?

Есть Repository, он выбирает данные из базы данных с учетом языка. Также у него есть свои зависимости.
class Repository implements IRepository
{
    private $defaultLang = 'ru-RU';
    private $lang;

    private $dep1;
    private $dep2;

    public function __construct(IDep $dep1, IDep $dep2)
    {
        $this->dep1 = $dep1;
        $this->dep2 = $dep2;
    }

    public function setLang($lang)
    {
        $this->lang = $lang;
    }

    /* ... */
}


Как я объявляю его в DI:
\Yii::$container->set('IRepository', 'Repository');

Все хорошо, объект создается и подтягиваются его зависимости.

Теперь мне необходимо, чтобы, куда бы он не подключался, после его инициализации и подгрузки зависимостей вызывался метод
$repo->setLang(Yii::$app->language);
Чтобы он был сразу инициализирован с языком приложения.

А еще лучше сделать абстрактный класс LangRepository.
abstract class LangRepository
{
    private $defaultLang = 'ru-RU';
    private $lang;

    public function setLang($lang)
    {
        $this->lang = $lang;
    }
}

И для всех наследующих его классов после инициализации в DI вызывать метод
$repo->setLang(Yii::$app->language);

Вопрос - как реализовать подобное внедрение?

Нашел пока такое решение:
\Yii::$container->set('IRepository', function(){
    $repo = new Repository(new Dep1, new Dep2);
    $repo->setLang(Yii::$app->language);
});


Но тут надо будет руками подключать зависимости + если они еще добавятся их также тут надо будет руками подключить, что не очень удобно.
  • Вопрос задан
  • 273 просмотра
Решения вопроса 1
mashletov
@mashletov
Math.random()
Почему нельзя сделать setLang в конструкторе у LangRepository? По теме — никак. Не думаю, что в Yii, есть какое-то событие при внедрении.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы