Инъекция зависимостей в PHP (slim, php-di)

Инъекция зависимостей в PHP (slim, php-di)

20.11.2019 10:15:38 Просмотров 35 Источник

У меня есть тонкий 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)

Woodrow

20.11.2019 10:33:33

Не добавляя LoggerInterfaceв качестве именованной записи в контейнер, не могли бы вы просто ввести LoggerInterface? То есть в $container->get()функция приложения php:

routes.php
Alex Barker

20.11.2019 10:34:25

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

Закрыть X