Zend Framework 2 控制器和 FactroyInterface

Zend Framework 2 Controller and FactroyInterface

从我的工厂,我将 serviceLocator 传递给控制器​​,但似乎没有调用 ObservationFactory,即使我已经包含在模块的 module.config.php 文件中

这是我的 ObservationController.php

    class ObservationController extends AbstractActionController
{
    private $em;
    public function __construct($ob)
    {
        $this->em = $ob->get('doctrine.entitymanager.orm_default');
    }

这里是ObservationFactory.php

    class ObservationFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $controller = new ObservationController($serviceLocator->getServicelocator());
        return $controller;
    }
}

并在 Module.config.php

'controllers' => array(
    'factories' => array(
        'Observation\Controller\ObservationController' => 'Observation\Controller\ObservationFactory'
    ),
    'invokables' => array(
            'Observation\Controller\Observation'=> Controller\ObservationController::class
    ),
),

Missing argument 1 for Observation\Controller\ObservationController::__construct(), called in S:\xampp\htdocs\v3\vendor\zendframework\zend-servicemanager\src\AbstractPluginManager.php on line 207 and defined in S:\xampp\htdocs\v3\module\Observation\src\Observation\Controller\ObservationController.php on line 47

Notice: Undefined variable: ob in S:\xampp\htdocs\v3\module\Observation\src\Observation\Controller\ObservationController.php on line 49

Fatal error: Uncaught Error: Call to a member function get() on unknown in

由于您的 ObservationController 正在其构造函数中接受参数,因此您不再需要将控制器称为 invokables。这是行不通的。因为一个可调用的 class 不能用参数构造。

而每当您需要控制器的参数时,您应该为该控制器创建一个您已经做过的工厂。只需隐藏或删除 invokables 键下的 ObservationController 如下

'controllers' => array(
    'factories' => array(
        'Observation\Controller\Observation' => 'Observation\Controller\ObservationFactory'
    ),
    'invokables' => array(
        // 'Observation\Controller\Observation'=> Controller\ObservationController::class
    ),
),   

如果您想为 ZF3 准备代码,请使用此结构:

return [
    'controllers' => [
        'aliases' => [
            'Observation\Controller\Observation' => Observation\Controller\ObservationController::class,
        ],
        'factories' => [
            Observation\Controller\ObservationController::class => Observation\Controller\ObservationControllerFactory::class,
        ],
    ],
];