如何访问 ZF3 控制器内的服务定位器对象?

How to access service locator object inside a controller in ZF3?

我正在尝试访问控制器内的服务定位器对象,但无法执行此操作。
我尝试了在线帮助,但大多数人都遵循 ZF2

的方法

以前 zf2 中的 Servicelocator 访问是轻而易举的,我只需要做 $this->getServiceLocator();

我已经尝试为我的控制器创建工厂 Class 并在那里创建了 createService 方法,但它说我也必须实现 __invoke() 方法。

我的Objective就是这样

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


任何人都可以为我提供实现此目标的完整步骤吗?

在问这个问题之前,我已经尝试实现几乎所有与 Servicelocator 相关的答案,所以请在将其标记为重复或其他内容之前帮助我,忽略错别字

只要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('Application\Model\PropertyTable');
    return new Controller($propertyTable);
}

在 ZF3 中,不建议将服务定位器传递给控制器​​。 您需要从控制器工厂内的 $container 获取所有依赖项,并通过构造函数(或设置器)将它们传递到控制器中。

感谢大家告诉我我做错了。
对这个主题的更多研究帮助我解决了我的问题
以下是我为解决该问题所做的工作

  • 为你的控制器创建工厂class
    您必须为您的控制器创建一个工厂 class,它将实现 zend 的 FactoryInterface。 在那里你必须打电话

    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
     {
           return new ListController($container->get(PropertyInterface::class));
     }
    


    在这里,我传递了 属性 接口引用,它由我的另一个 table 实现,称为 属性 Table,其中我已经为模型 [=28= 的所有接口函数提供了主体] 喜欢搜索属性()

  • 在配置文件 module.config.php 中为您的控制器添加工厂 class
    指示配置文件让我们的工厂为我们的控制器创建对象

    'controllers' => [
                'factories' => [
                    // Update the following line:
                    Controller\ListController::class => Factory\ListControllerFactory::class,
                ],
            ],
    


  • 在配置文件中注册您的模型
    您必须为服务管理器添加新部分并在那里提供您的模型 classes。

    // Add this section:
            'service_manager' => [
                'aliases' => [
                    Model\PropertyInterface::class => Model\PropertyTable::class,
                ],
                'factories' => [
                    Model\PropertyTable::class => InvokableFactory::class,
                ],
            ],
    



  • 现在唯一剩下的就是在你的 属性 接口中添加函数并在 属性Table 中为它们添加函数,然后在你的控制器中调用它们

    Complete Steps for implementation 帮助我实施了新流程。
    感谢社区。你们都是最棒的。

    另一种方式

    /**
     * Retrieve service manager instance
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     * @return ContainerInterface
     */
    public function getServiceLocator()
    {
        return $this->getEvent()->getApplication()->getServiceManager();
    }