我使用的是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