Есть 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);
});
Но тут надо будет руками подключать зависимости + если они еще добавятся их также тут надо будет руками подключить, что не очень удобно.