PHP-DI и контроллеры. Как избежать повтора кода?

Привет господа.

пример.

return[
    'Controller1' => \DI\factory(function (\Psr\Container\ContainerInterface $c){
        return new \project\Controllers\Controller2(
            $c->get('Service1'),
            $c->get('Service2'),
            $c->get('Service3')
        );
    }),
    'Controller2' => \DI\factory(function (\Psr\Container\ContainerInterface $c){
        return new \project\Controllers\Controller2(
            $c->get('Service1'),
            $c->get('Service2'),
            $c->get('Service3')
        );
    }),
    'Controller3' => \DI\factory(function (\Psr\Container\ContainerInterface $c){
        return new \project\Controllers\Controller3(
            $c->get('Service1'),
            $c->get('Service2'),
            $c->get('Service3')
        );
    }),
    'Service1' => function(){
         return new \project\Services\Service1();
    },

    'Service2' => \DI\factory(function (\Psr\Container\ContainerInterface $c){
        return new \project\Service\Service2($c->get('Service1'));
    }),

    'Service3'=> function(\Psr\Container\ContainerInterface $c){
        return new \project\Service\Service3($c->get('setting'));
    }
];


Как избежать такого дублирования в контроллерах? Уже глаз замылился доки читать ((
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
Vamp
@Vamp
Если аргументы конструктора у контроллеров помечены type hint'ами, то контроллеры необязательно регистрировать в контейнере. Можно создавать их напрямую по имени класса:

$controller3 = $container->get('project\Controllers\Controller3');

Здесь используется фича autowiring, которая по умолчанию включена. PHP-DI смотрит при помощи рефлексии какие типы требует конструктор контроллера и подставляет соответствующие сервисы, зарегистрированные в контейнере.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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