Я читал документацию Zend 3 по Service Manager и столкнулся с этой проблемой.
В документации говорится, что если у нас есть какой-то DI в нашем контроллере, мы должны обновить файл module.config.php
и добавить ключ контроллера и вызвать контроллер не с InvokableFactory::class
, а с пользовательским фабричным классом и добавить еще один ключ service_manager, который содержит массив классов, которые использует мой первый контроллер.
Хорошо, так что я делаю это:
модуль.config.php
'service_manager' => [
'factories' => [
Controller\Controller2::class => Factory\Controller2Factory::class,
Controller\Controller3::class => Factory\Controller3Factory::class,
],
],
'controllers' => [
'factories' => [
Controller\Controller1::class => Factory\Controller1Factory::class
],
]
Controller1Factory.php
class Controller1Factory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
return new Controller1(
$container->get(Controller2::class),
$container->get(Controller3::class),
);
}
}
Но теперь у меня ошибка, что Controller2 и Controller3 также имеют DI в своих конструкторах, поэтому я создаю новые пользовательские фабрики и так далее, и так далее... пока не доберусь до своих моделей.
И у моделей также есть зависимость, которая вводится в их контроллер, который является нативным \Zend\Db\TableGateway\TableGatewayInterface
zend, и теперь мне нужно снова отредактировать файл conf и добавить TableGatewayInterface
.
И это неправильно. Я никогда не должен быть вынужден внедрять родные классы и сервисы Zend таким образом.
Так что я делаю неправильно?