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