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


Multiple Controllers Zend Framework 2 - Entity Manager Doctrine 2

我使用的是Zend Framework 2.2.2和Doctrine2模块0.7.0。

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

此工作流需要来自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:''examplep''htdocs''app''trunk''modules''MTNewsletter Engine''src''MTNewslette Engine''Controller''Newsletter Engine Controller.php中非对象的成员函数get()

第51行:

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

时事通讯引擎控制器是模块MT时事通讯发动机的主控制器。

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

不要使用new关键字创建NewsletterEngineController的新实例。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