首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ServiceManager in ZF3

ServiceManager in ZF3
EN

Stack Overflow用户
提问于 2017-02-10 21:01:56
回答 2查看 5.5K关注 0票数 8

我知道其他线程已经对此进行了广泛的讨论,但我很难从ZF2控制器中复制$ this ->getServiceLocator()在ZF3控制器中的效果。

我尝试用我在这里和其他地方找到的各种其他答案和教程创建一个工厂,但最终却把它们弄得一团糟,所以我在粘贴我的代码,就像我一开始希望有人为我指明正确的方向时那样?

来自/module/Application/config/module.config.php

代码语言:javascript
复制
'controllers' => [
    'factories' => [
        Controller\IndexController::class => InvokableFactory::class,
    ],
],

来自/module/Application/src/Controller/IndexController.php

代码语言:javascript
复制
public function __construct() {
    $this->objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
    $this->trust = new Trust;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-11 13:02:17

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

您应该再添加一个类IndexControllerFactory,在那里您将获得依赖项并将其注入IndexController中。

首先重构配置:

代码语言:javascript
复制
'controllers' => [
    'factories' => [
        Controller\IndexController::class => Controller\IndexControllerFactory::class,
    ],
],

而不是创建IndexControllerFactory.php

代码语言:javascript
复制
<?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以获得依赖关系

代码语言:javascript
复制
public function __construct(\Doctrine\ORM\EntityManager $object) {
    $this->objectManager = $object;
    $this->trust = new Trust;
}

你应该检查一下官方文档zend-servicemanager,然后玩一玩.

票数 15
EN

Stack Overflow用户

发布于 2019-01-31 10:53:05

虽然被接受的答案是正确的,但我将通过将容器注入控制器来实现我的答案,然后在构造函数中获得其他依赖项,如……

代码语言:javascript
复制
<?php

namespace moduleName\Controller\Factory;

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use moduleName\Controller\ControllerName;

class ControllerNameFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        return new ControllerName($container);
    }

}

您的控制器应该如下所示:

代码语言:javascript
复制
namespace ModuleName\Controller;


use Doctrine\ORM\EntityManager;
use Zend\ServiceManager\ServiceManager;


class ControllerName extends \App\Controller\AbstractBaseController
{

    private $orm;

    public function __construct(ServiceManager $container)
    {
        parent::__construct($container);

        $this->orm = $container->get(EntityManager::class);
    }

在您的module.config中,请确保按如下方式注册工厂:

代码语言:javascript
复制
'controllers' => [
    'factories' => [
        ControllerName::class => Controller\Factory\ControllerNameFactory::class,
],
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42168619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档