如何访问服务定位器对象ZF3控制器里面?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何访问服务定位器对象ZF3控制器里面?相关的知识,希望对你有一定的参考价值。

我试图访问我的控制器内部的服务定位对象,但无法做到这一点。 我试图联机帮助,但他们大多正在跟踪ZF2方法

以前在zf2服务定位器访问是一件轻而易举的,我只是做$这个 - > getServiceLocator();

我曾尝试创建我的控制器工厂类和创建的CreateService方法有,但它说我要实现__invoke()方法了。

我的目标是做这样的事情

public function getPropertyTable()
{
    if (!$this->PropertyTable) {
        $sm = $this->getServiceLocator();
        $this->PropertyTable = $sm->get('ApplicationModelPropertyTable');
    }
    return $this->PropertyTable;
}

谁能给我提供一个完整的步骤来实现这一目标?

我试图问这个问题之前,实现几乎所有涉及到的ServiceLocator的答案,所以请帮我这个标记作为复制或某件事之前,忽略了错别字

答案

谢谢大家告诉我,我做了错误的方式。 关于这个主题的一些更多的研究,帮助我让我的问题解决了 这里是我做了什么来解决这个问题

  • 创建工厂类的控制器 你必须为你的控制器工厂类将实施的Zend的FactoryInterface。在那里你必须调用 public function __invoke(ContainerInterface $container, $requestedName, array $options = null) { return new ListController($container->get(PropertyInterface::class)); } 在这里,我路过这是由我称为房产表另一个表中,我已经给身体为模型的所有我inteface功能实现PropertyInterface refrence 像searchProperty()
  • 在配置文件中module.config.php加入工厂类控制器 指示配置文件,让我们的工厂创建对象为我们的控制器 'controllers' => [ 'factories' => [ // Update the following line: ControllerListController::class => FactoryListControllerFactory::class, ], ],
  • 注册您的配置文件模式 你要添加新的部分服务经理,并提供你的模型类出现。 // Add this section: 'service_manager' => [ 'aliases' => [ ModelPropertyInterface::class => ModelPropertyTable::class, ], 'factories' => [ ModelPropertyTable::class => InvokableFactory::class, ], ],
  • 现在,唯一剩下的就是你的财产界面增加功能与实现属性表中的他们,然后叫他们在你的控制器

    Complete Steps for implementation 帮我实施新的流动。 感谢社区。你所有的是最好的。

    另一答案

    只要在ZF3新工厂接口:

    interface FactoryInterface
    {
        /**
         * Create an object
         *
         * @param  ContainerInterface $container
         * @param  string             $requestedName
         * @param  null|array         $options
         * @return object
         */
        public function __invoke(ContainerInterface $container, $requestedName, array $options = null);
    }
    

    你必须实现你的工厂这样。

    为了帮助你,你可以使用link

    编辑:

    在实践中,你应该有这样的:

    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $propertyTable = $container->get('ApplicationModelPropertyTable');
        return new Controller($propertyTable);
    }
    
    另一答案

    其他方式

    /**
     * Retrieve service manager instance
     * @throws PsrContainerContainerExceptionInterface
     * @throws PsrContainerNotFoundExceptionInterface
     * @return ContainerInterface
     */
    public function getServiceLocator()
    {
        return $this->getEvent()->getApplication()->getServiceManager();
    }
    
    
    另一答案

    在ZF3不建议到服务定位器传递到控制器。你需要得到从$容器所有依赖内部控制的工厂和他们通入控制器通过构造函数(或setter方法)。

    以上是关于如何访问服务定位器对象ZF3控制器里面?的主要内容,如果未能解决你的问题,请参考以下文章

    使用 TableGateway ZF2/ZF3 编写类测试

    如何从另一个片段访问片段对象

    ZF3 Doctrine Object 提供给 Escape 助手,但标志不允许递归

    打开 ZF3 骨架应用程序只显示源代码而不显示网页

    Forge Viewer - 如何在场景中访问(或获取渲染/片段代理)克隆的网格?

    如何在 ZF3 应用程序的功能 PHPUnit 测试中关闭数据库连接并减少它们的数量?