Zend Framework 2 Controller和FactroyInterface

时间:2017-07-11 11:18:51

标签: php zend-framework zend-framework2

从我的工厂我将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
    ),
),
  

缺少观察1的Observation \ Controller \ ObservationController :: __ construct(),在第207行的S:\ xampp \ htdocs \ v3 \ vendor \ zendframework \ zend-servicemanager \ src \ AbstractPluginManager.php中调用,并在S中定义:第47行\ xampp \ htdocs \ v3 \ module \ Observation \ src \ Observation \ Controller \ ObservationController.php

     

注意:未定义的变量:ob in   S:\ XAMPP \ htdocs中\ V3 \模块\观察的\ src \观察\控制器\ ObservationController.php   第49行

     

致命错误:未捕获错误:调用成员函数get()   

中未知

2 个答案:

答案 0 :(得分:2)

当您的ObservationController在其构造函数中使用参数时,您不再需要将控制器调用为invokables。它不会起作用。因为不能使用参数构造可调用的类。

然而,无论何时您需要控制器的参数,您都应该为该控制器建立一个您已经做过的工厂。只需隐藏或删除ObservationController密钥下的invokables,如下所示

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

答案 1 :(得分:2)

如果要为ZF3准备代码,请使用以下结构:

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