Как использовать правильно DI-контейнер

148
27 декабря 2020, 20:20

У меня следующая задача:

В проекте планирую использовать логгер (перед созданием объекта логгера, требуется его конфигурировать) у этого логгера могут быть разные зависимост и т.д.

Решил использовать DI-контейнер, ранее с ними не работал. (например простой DI контейнер Pimple)

Правильно понимаю, что если я создаю сам контейнер в каком-то своем файле, далее при использовании этого контейнера в других файлах, мне придется заново описывать все связи и сервисы в этом контейнере? Или есть какие-то режимы работы (типа синглтона)?

Answer 1

DI - это внедрение зависимостей. Ваша зависимость - это логгер. Как ее внедрить - есть несколько способов, я обычно использую внедрение через конструктор.

Представьте, что у вас нет никакого DI контейнера. Например, у вас есть какой-нибудь класс, который использует какой-нибудь логгер LoggerInterface.

Вы его спокойно описываете

class Handler
{
  private $logger;
  public function __container(LoggerInterface $logger)
  {
    $this->logger = $logger;
  }
  public function save($data)
  {
    // saving...
    $this->logger->logMessage('message');
    // other handling...
  }
}

В этом коде нет никакого упоминания о DI контейнере.

Теперь вам необходимо отдельно описать логику внедрения. Она может отличаться от конкретных DI контейнеров. Но суть в том, что она идет отдельно от вашего приложения, например можно сделать файлик di-config.php, описать в нем конфиг DI и подключать его где надо.

READ ALSO
Нюансы при слиянии массивов

Нюансы при слиянии массивов

Подскажите что я не правильно делаю при слиянии массивов ?

118
Joomla - как вывести компонент внутри модуля?

Joomla - как вывести компонент внутри модуля?

Я хочу открыть компонент в модуле, для размещения его под контентной частью на нескольких страницах сайтаМожно ли как-то организовать код...

121
Как убрать символ \u200b из строки php

Как убрать символ \u200b из строки php

При импорте данных(штрих-коды товаров) в таблицу MySQL в конце одной строки появляется символ \u200b Как его убрать? Сначала получаю данные из массива,...

103
SSL routines:tls_process_server_certificate:certificate verify failed

SSL routines:tls_process_server_certificate:certificate verify failed

При установке с помощью композера любых пакетов, выпадает ошибка

107