Roquie
@Roquie

Как управлять своими и сторонними зависимостями с помощью IoC контейнера?

На данный момент имеется библиотека, где по плохому создаются экземпляры классов-зависимостей прямо в конструкторе.
Надо:
1. положить все сторонние зависимости в контейнер
2. положить библиотеку в контейнер
3. придумать как внедрить зависимости в библиотеку и ее классы
4. использовать класс как раньше.

Не понимаю, как использовать зависимости в своих классах. Пока на ум пришла одна мысль - использовать главный App класс, который будет глобален в NS библиотеки и затем, используя синглтон получать объект контейнера в конструкторе зависимых классов.

$app = new Illuminate\Container\Container();
$app->bind('app', $app);
$app->bind('log', $log);


class A extends SplObjectStorage 
{

    protected $log = null;
    
    public function __construct()
    {
        //как я должен использовать контейнер, чтобы напрямую не передавать его в конструктор при вызове?
        $this->log = new MongoLog();    
    }
    
}

class B extends A {}

class C extends A {}


$a = new A(); // т.е. оставить вызов и использование библиотеки таким, каков он есть
  • Вопрос задан
  • 2506 просмотров
Пригласить эксперта
Ответы на вопрос 1
vanchelo
@vanchelo
$app = new Illuminate\Container\Container();
$app->bind('app', $app);
$app->instance('log', $log);
$app->bind('MongoLog', 'log');

class A extends SplObjectStorage 
{
    protected $log;
    
    public function __construct(MongoLog $log)
    {
        $this->log = $log;   
    }
}

class B extends A {}

class C extends A {}

$a = $app->make('A');
$b = $app->make('B');
$c = $app->make('C');
Ответ написан
Ваш ответ на вопрос

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

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