Я знаю, что это широко освещалось в других потоках, но я изо всех сил пытаюсь решить, как реплицировать эффект $ 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 и немного поиграть …