多个控制器Zend Framework 2 - 实体管理器原则2

时间:2013-08-05 08:56:23

标签: php doctrine-orm frameworks zend-framework2

我正在使用Zend Framework 2.2.2和Doctrine2 Module 0.7.0。

我的目标是让我的函数与独立的php-class中的任务相关。我目前的工作流程介于两个不同的程序之间:获取数据 - >修改和存储数据 - >发送数据。

此工作流程需要3个ZF2模块的功能: 1.源软件模块 2.内部存储机制模块 3.目标软件模块

第一个任务是成功的,但当我将数据移动到第二个模块时(缩小到主代码):

use MTNewsletterEngine\Controller\NewsletterEngineController;

/** @var  \MTNewsletterEngine\Controller\NewsletterEngineController */
private $_newsletterEngine;

$this->_newsletterEngine = new NewsletterEngineController();
[...]
$this->_newsletterEngine->addNewNewsletterRecipient($emailAddresses,1);

第二个控制器在获取服务定位器时遇到问题:

致命错误:在第51行的C:\ xampp \ htdocs \ app \ trunk \ module \ MTNewsletterEngine \ src \ MTNewsletterEngine \ Controller \ NewsletterEngineController.php中的非对象上调用成员函数get()

第51行:

$em_mtnewsletterengine = $this->getServiceLocator()->get('doctrine.entitymanager.orm_mtnewsletterengine');

NewsletterEngineController是模块MTNewsletterEngine的主控制器。

我很困惑,因为我不知道如何解决这个问题。感谢。

1 个答案:

答案 0 :(得分:0)

请勿使用NewsletterEngineController关键字创建new的新实例。 ServiceLocator不会以这种方式注入到创建的对象中。使用 Zend \ ServiceManager 检索Zend\Mvc\Controller\ControllerManager的实例(别名:“ControllerLoader”(ci))并使用get方法加载目标控制器。 Zend\Mvc\Controller\ControllerManager扩展了ServiceManager本身(因为它是一个插件管理器)。

检查你的module.config.php。控制器应列为可调用的控制器。

实施例

'controllers' => array(
    'invokables' => array(
        'MTNewsletterEngine\Controller\NewsletterEngine' => 'MTNewsletterEngine\Controller\NewsletterEngineController'
    ),
),


$this->_newsletterEngine = $this->getServiceLocator()
        ->get('ControllerLoader')
        ->get('MTNewsletterEngine\Controller\NewsletterEngine');


有关更多信息,请阅读手册并尝试了解ServiceManager / ServiceLocator(它是 Zend \ Di 的一部分)的工作方式。

也许您还应该考虑应用程序的结构。我不确定你在做什么,但似乎你正在混合不同的应用层。

文档

http://framework.zend.com/manual/2.2/en/index.html#zend-di
http://framework.zend.com/manual/2.2/en/index.html#zend-servicemanager