ServiceManager в ZF3

Я знаю, что это широко освещалось в других потоках, но я изо всех сил пытаюсь решить, как реплицировать эффект $ this-> getServiceLocator () из ZF2-контроллеров в ZF3.

Я попытался создать фабрику, используя различные другие ответы и учебные пособия, которые я нашел здесь и в других местах, но в конечном итоге столкнулся с каждым из них, поэтому я вставляю свой код так, как это было, когда я начал с надежды, что кто-то может указать мне в правильном направлении?

Из /module/Application/config/module.config.php

'controllers' => [ 'factories' => [ Controller\IndexController::class => InvokableFactory::class, ], ], 

Из /module/Application/src/Controller/IndexController.php

 public function __construct() { $this->objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); $this->trust = new Trust; } 

Вы больше не можете использовать $ this-> getServiceLocator () в контроллере .

Вы должны добавить еще один класс IndexControllerFactory, где вы получите зависимости и введите его в IndexController

Первый рефакторинг вашей конфигурации:

 'controllers' => [ 'factories' => [ Controller\IndexController::class => Controller\IndexControllerFactory::class, ], ], 

Затем создайте IndexControllerFactory.php

 <?php namespace ModuleName\Controller; use ModuleName\Controller\IndexController; use Interop\Container\ContainerInterface; use Zend\ServiceManager\Factory\FactoryInterface; class IndexControllerFactory implements FactoryInterface { public function __invoke(ContainerInterface $container,$requestedName, array $options = null) { return new IndexController( $container->get(\Doctrine\ORM\EntityManager::class) ); } } 

В конце рефакторе вы IndexController, чтобы получить зависимости

 public function __construct(\Doctrine\ORM\EntityManager $object) { $this->objectManager = $object; $this->trust = new Trust; } 

Вы должны проверить официальную документацию zend-servicemanager и немного поиграть …