2014-06-28 48 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\供應商命名空間