6

Я знаю, что это было широко распространено в других потоках, но я изо всех сил пытаюсь решить, как реплицировать эффект $ this-> getServiceLocator() из ZF2-контроллеров в ZF3.ServiceManager в 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; 
} 

ответ

11

You can not use $this->getServiceLocator() in controller any more.

Вы должны добавить еще один класс 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 и играть вокруг немного ...

+0

Спасибо! Это конфиг, где я ошибался. –

+0

Хороший пример! Учитывая, что у вас более одного действия на контроллер, но у вас есть один завод на контроллер. Если вы используете объект для определенных действий, которые не используются на другом, вы инициализируете дополнительные объекты в тех же случаях. Каким должно быть решение по этому делу? –

+0

Простой :) создайте только одно действие для каждого контроллера. На самом деле это тенденция в настоящее время с микро-фреймворками и посредниками PHP ... – tasmaniski

Смежные вопросы