【问题标题】:Multiple Controllers Zend Framework 2 - Entity Manager Doctrine 2多控制器 Zend Framework 2 - Entity Manager Doctrine 2
【发布时间】:2013-08-05 22:07:15
【问题描述】:

我正在使用 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);

第二个Controller获取服务定位器有问题:

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

第 51 行:

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

NewsletterEngineController 是模块 MTNewsletterEngine 的主控制器。

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

【问题讨论】:

    标签: php doctrine-orm frameworks zend-framework2


    【解决方案1】:

    不要使用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

    【讨论】:

    • 我试过这个,但我得到 Zend\ServiceManager\ServiceManager::get 无法获取或创建 MTNewsletterEngine\Controller\NewsletterEngine 的实例,但控制器像您的代码一样在我的可调用对象中。
    • 你是对的。 ServiceManager 不加载控制器。 ServiceManager 加载一个名为 Zend\Mvc\Controller\ControllerManager 的 PluginManager,它负责加载控制器和注入依赖项。我已经编辑了我的答案并在 ZF 2.2 上测试了代码
    • 感谢您的编辑,这太棒了!不再通过参数传递 ServiceManager!
    猜你喜欢
    • 2011-12-13
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多