-1

我正在使用 Zend Framework 2.2.2 和 Doctrine2 Module 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:\xampp\htdocs\app\trunk\module\MTNewsletterEngine\src\MTNewsletterEngine\Controller\NewsletterEngineController.php 中的非对象的成员函数 get()

第 51 行:

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

NewsletterEngineController 是模块 MTNewsletterEngine 的主控制器。

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

4

1 回答 1

0

不要NewsletterEngineController使用new关键字创建新的实例。ServiceLocator 不会以这种方式注入到创建的对象中。使用 Zend\ServiceManagerZend\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

于 2013-08-05T12:42:47.427 回答