首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调度控制器zf2事件管理器

调度控制器zf2事件管理器
EN

Stack Overflow用户
提问于 2014-06-28 17:42:55
回答 2查看 530关注 0票数 0

我有一个名为MyController的基本控制器,我从MyController扩展了controller,而不是AbstractActionController,这段代码有什么问题?

这不管用:

代码语言:javascript
复制
$sharedEventManager->attach('MyController', 'dispatch', function ($e) {
    $controller = $e->getTarget();
},100) ;

但这确实是:

代码语言:javascript
复制
$sharedEventManager->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function ($e) {
    $controller = $e->getTarget();
},100) ;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-29 11:30:46

SharedEventManager::attach()的第一个参数是要目标的事件管理器的标识。该标识被动态地分配给任何具有事件能力的类(实现Zend\EventManager\EventManagerAwareInterface),或者通过$eventManager->setIdentity()设置了它的标识。

这个问题涉及到\Zend\Mvc\Controller\AbstractActionController;这本身就是给任何扩展\Zend\Mvc\AbstractActionController (以及其他)的控制器的标识,允许只允许一个id到attach()来针对所有控制器。

要只针对一个控制器(这是完全有效的,有很多用例),您可以通过两种方式这样做:

  1. 通过SharedEventManager,控制器类的外部(就像您一直做的那样)
  2. 直接获取控制器的事件管理器并处理控制器类中的事件。

通过SharedEventManager

使用完全限定的类名,因为它作为标识添加到事件管理器中。

代码语言:javascript
复制
$sharedEventManager->attach(
    'MyModule\Controller\FooController', 'dispatch', function($e){
    // do some work
});

控制器内的

我修改了普通的attachDefaultListeners()方法(它被自动调用),您可以在这里直接附加事件。

代码语言:javascript
复制
namespace MyModule\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\EventManager\EventInterface;

class FooController extends AbstractActionController
{ 
    protected function attachDefaultListeners()
    {
      // make sure you attach the defaults!
      parent::attachDefaultListeners();

      // Now add your own listeners
      $this->getEventManager()->attach('dispatch', array($this, 'doSomeWork'));
    }

    public function doSomeWork(EventInterface $event) {
      // do some work
    }

}
票数 2
EN

Stack Overflow用户

发布于 2014-06-28 19:38:02

你为什么要用你自己的基地控制器?这样做没有真正的好处,除非你有罕见的边缘情况。

您的基本控制器类在AbstractController中丢失了这个部分:

代码语言:javascript
复制
/**
 * Set the event manager instance used by this context
 *
 * @param EventManagerInterface $events
 * @return AbstractController
 */
public function setEventManager(EventManagerInterface $events)
{
    $events->setIdentifiers(array(
        'Zend\Stdlib\DispatchableInterface',
        __CLASS__,
        get_class($this),
        $this->eventIdentifier,
        substr(get_class($this), 0, strpos(get_class($this), '\\'))
    ));
    $this->events = $events;
    $this->attachDefaultListeners();

    return $this;
}

看到setIdentifiers打来的电话了吗?这就是为什么第二个例子有效的原因。

另外,我怀疑您可能不会在控制器的dispatch()方法中实际触发分派事件。

另外,请注意:不应该创建没有顶级命名空间的类。我所有的类都使用Xrks\供应商命名空间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24469400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档