我有以下控制器:
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
为什么不注射?
答案 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