Инъекция зависимостей в PHP (slim, php-di)
У меня есть тонкий Php (slim4) приложение, к которому я добавил монолог для целей ведения журнала. Я добавляю регистратор в приложение следующим образом:
$containerBuilder->addDefinitions([
LoggerInterface::class => function (ContainerInterface $c) {
$logger = new Logger('appname');
...
return $logger
Это отлично работает для инъекции регистратора в большинстве моих классов, просто делая:
public function __construct(ContainerInterface $container = null, LoggerInterface $logger)
{
// I can use $logger here
Теперь я также хотел бы использовать регистратор в промежуточном программном обеспечении, таком как аутентификация. Я не вижу, как я могу правильно это сделать. Я могу заставить это работать, добавив регистратор в качестве именованной записи в контейнере, как это:
$containerBuilder->addDefinitions([
"LoggerInterface" => function (ContainerInterface $c) {
а затем передать его в промежуточное программное обеспечение в качестве параметра конструктора, получив его обратно из контейнера:
$middlewares[] = new MyAuthentication(..., $container->get('LoggerInterface'));
Но это:
- a) разрывает инъекцию по имени класса для других классов
- Б) есть видимо, не лучшая практика
Итак, каков правильный способ получить этот регистратор, введенный в промежуточное программное обеспечение?
Ответы - Инъекция зависимостей в PHP (slim, php-di) / Dependency injection in PHP (slim, php-di)


20.11.2019 10:34:25
Короче говоря, я не думаю, что вы сможете автоматически подключать зависимости для промежуточного программного обеспечения, поскольку они должны быть построены до добавления к маршрутизатору. Вам нужно будет явно ввести зависимость, как это было предложено @Woodrow, хотя я бы выбрал инъекцию метода вместо инъекции конструктора для LoggerInterface, поскольку он будет придерживаться LoggerAwareInterface.