【问题标题】:ServiceManager in ZF3ZF3 中的服务管理器
【发布时间】:2017-06-29 08:19:25
【问题描述】:

我知道这已在其他线程中广泛介绍,但我正在努力研究如何在 ZF3 控制器中从 ZF2 控制器复制 $this->getServiceLocator() 的效果。

我尝试使用在此处和其他地方找到的各种其他答案和教程创建工厂,但最后都弄得一团糟,所以我粘贴了我开始时的代码希望有人能指出我正确的方向吗?

来自/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;
}

【问题讨论】:

    标签: php zend-framework-mvc zend-framework3 zend-servicemanager


    【解决方案1】:

    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 并玩一下......

    【讨论】:

    • 谢谢!这是我一直犯错误的配置。
    • 很好的例子!考虑到每个控制器有多个动作,但每个控制器有一个工厂。如果您在特定操作上使用一个对象而在其他操作上不使用,那么您将在相同的情况下初始化额外的对象。这种情况应该怎么解决?
    • 简单 :) 每个控制器只创建一个动作。实际上,微框架和 PHP 中间件现在是趋势......
    【解决方案2】:

    虽然接受的答案是正确的,但我将通过将容器注入控制器然后在构造函数中获取其他依赖项来实现我的有点不同......

    <?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);
        }
    
    }
    

    您的控制器应如下所示:

    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中,一定要像这样注册工厂:

    'controllers' => [
        'factories' => [
            ControllerName::class => Controller\Factory\ControllerNameFactory::class,
    ],
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多