Правильный способ использования сервис-менеджера в Zend3

Я читал документацию Zend 3 на Service Manager, и у меня возникла эта проблема.

В документации сказано, что если в контроллере есть какой-то DI, мы должны обновить module.config.php файл и добавить ключ контроллеров и вызвать контроллер не с InvokableFactory::class но с пользовательским классом фабрики и добавьте другой ключ service_manager, который содержит массив классов, которые использует мой первый контроллер.

Хорошо, я делаю это:

module.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 и теперь мне нужно снова отредактировать файл conf и добавить TableGatewayInterface,

И это неправильно. Я никогда не должен быть вынужден вводить нативные классы и сервисы Zend таким образом.

Так что я делаю не так?

0

Решение

Если ваш контроллер не имеет зависимости, это лучший способ объявить его в module.config.php как ты.

Но если у него есть зависимости, лучше сделать это в Module.php, Сначала вы объявляете свои услуги, а затем контроллер (не забудьте удалить его из module.config.php), внедряя в него свои услуги, зависит:

public function getServiceConfig()
{
return [
'factories' => [
Model\MyObjectTable::class => function($container) {
$tableGateway = $container->get(Model\MyObjectTableGateway::class);
return new Model\MyObjectTable($tableGateway);
},
Model\MyObjectTableGateway::class => function($container) {
$dbAdapter = $container->get(AdapterInterface::class);
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Model\User());
return new TableGateway('myObject', $dbAdapter, null, $resultSetPrototype);
},
]
];
}

public function getControllerConfig()
{
return [
'factories' => [
Controller\MyObjectController::class => function($container) {
return new Controller\MyObjectController(
$container->get(Model\MyObjectTable::class)
);
},
]
];
}

И в вашем контроллере:

private $table;

public function __construct(MyObjectTable $table)
{
$this->table = $table ;
}

Это описано в Эта страница учебника ZF3 и следующие.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]