zend 2注入到控制器:可捕获的致命错误:传递给someController :: __ construct()的参数1必须是...的实例

时间:2016-07-25 13:18:00

标签: zend-framework2

我有以下控制器:

namespace Application\Controller;

use Application\Model\Person;
use Zend\Mvc\Controller\AbstractActionController;
use Application\Model\PersonTable;

class PersonController extends AbstractActionController
{
    private $table;

    public function __construct(PersonTable $table)
    {
        $this->table = $table;
    }
    // other methods
}

我尝试按照以下文档进行注射:

https://docs.zendframework.com/tutorials/getting-started/database-and-models/

在module / Application / Module.php中我添加了这个函数:

public function getControllerConfig()
    {
        return [
            'factories' => [
                Controller\PersonController::class => function($container) {
                    return new Controller\PersonController(
                        $container->get(Model\PersonTable::class)
                    );
                },
            ],
        ];
    }

在module / Application / config / module.config.php中我修改了这个,所以它会有我的控制器:

'controllers' => array(
        'invokables' => array(
            'Application\Controller\Index' => 'Application\Controller\IndexController',
            'Application\Controller\Person' => 'Application\Controller\PersonController'
        ),
    ),

我从控制台调用控制器方法并得到错误:

捕获致命错误:参数1传递给Application \ Controller \ PersonControl ler :: __ construct()必须是Application \ Controller \ PersonTable的实例,否 ne给出,在E:\ other \ dropbox \ Dropbox \ programavimas \ kodo pavyzdziai \ htdoc中调用 小号\ zend_2_staff_register \供应商\ zendframework \ zendframework \库\ Zend的\ ServiceM 第170行上的anager \ AbstractPluginManager.php,在E:\ other \ dropbox \ Dro中定义 pbox \ programavimas \ kodo pavyzdziai \ htdocs \ zend_2_staff_register \ module \ Applicati 在第12行的\ src \ Application \ Controller \ PersonController.php

为什么不注射?

1 个答案:

答案 0 :(得分:1)

因为你声明了你的

'Application\Controller\Person' => 'Application\Controller\PersonController'

作为一个invokables类,你需要将它设置为key:factories。

你是这样做的:

public function getControllerConfig()
    {
        return [
            'factories' => [
                Controller\PersonController::class => function($container) {
                    return new Controller\PersonController(
                        $container->get(Model\PersonTable::class)
                    );
                },
            ],
        ];
    }

Zf2中的Config被合并,因此PersonController最后由一个invokables加载,这段代码变得无用。

我建议你创建一个对象工厂而不是一个匿名函数并声明:

    'controllers' => array(
            'invokables' => array(
                'Application\Controller\Index' => 'Application\Controller\IndexController',
            ),
            'factories' => array(
                'Application\Controller\Person' => 'Application\Factory\PersonControllerFactory'
            ),
        ),

然后,此对象PersonControllerFactory将返回具有正确依赖关系的控制器实例。

这里是控制器工厂的一个例子(与服务工厂不同): https://github.com/Grafikart/BlogMVC/blob/master/ZendFramework2/module/Blog/src/Blog/Factory/PostControllerFactory.php

及其配置行 https://github.com/Grafikart/BlogMVC/blob/master/ZendFramework2/module/Blog/config/module.config.controllers.php#L8