2014-06-28 52 views
0

我有一个名为MyController的基础控制器 我从MyController而不是AbstractActionController扩展我的控制器 这段代码有什么问题?
它不工作:调度控制器zf2事件管理器

$sharedEventManager->attach('MyController', 'dispatch', function ($e) { 
    $controller = $e->getTarget(); 
},100) ; 

但确实:

$sharedEventManager->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function ($e) { 
    $controller = $e->getTarget(); 
},100) ; 
+0

什么是错误?你确定MyController是可见的吗?也许你应该把类似Controller \ MyController(带有命名空间) – tasmaniski

回答

2

SharedEventManager::attach()的第一个参数是事件管理器的目标身份。这个身份是动态分配给任何事件能力的类(实现Zend\EventManager\EventManagerAwareInterface)或通过$eventManager->setIdentity()设置了其他身份。

问题涉及\Zend\Mvc\Controller\AbstractActionController;这本身就是给予任何控制器的身份,其扩展了\Zend\Mvc\AbstractActionController(等等),允许只有一个id到attach()来定位所有控制器。通过SharedEventManager,外部控制器类

  1. (如你:

    仅定位到一个控制器(这是完全合法的,也有很多使用情况),您可以通过两种方式做到这一点已经在做)

  2. 直接提取所述控制器的事件管理器并处理控制器类中的事件。

通过SharedEventManager

,因为这是被添加作为身份到事件管理

$sharedEventManager->attach(
    'MyModule\Controller\FooController', 'dispatch', function($e){ 
    // do some work 
}); 

在控制器

我修改使用完全合格的类名正常attachDefaultListeners()方法(which is called automatically),这是你的地方可以直接附加事件。

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 
    } 

} 
1

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

你的控制器基类中缺少这一部分从一个AbstractController:

/** 
* 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\供应商命名空间