2014-03-04 246 views
0

我有一個關於Zendframework 2,Event manager和listener的問題。Zend框架2:AbstractListenerAggregate

class ApiErrorListener extends AbstractListenerAggregate { 
    public function attach(EventManagerInterface $events) 
    { 
     $this->listeners[] = $events->attach(MvcEvent::EVENT_RENDER, __CLASS__ . '::onRender', 1000); 
    } 

    public static function onRender(MvcEvent $e) 
    { 
     if($e->getResponse()->isOk()) 
     { 
      return; 
     } 

     $httpCode = $e->getResponse()->getStatusCode(); 
     $sm = $e->getApplication()->getServiceManager(); 
     $viewModel = $e->getResult(); 
     $exception = $viewModel->getVariable('exception'); 

     $model = new JsonModel(
      array(
       'errorCode' => !empty($exception) ? $exception->getCode() : $httpCode, 
       'errorMsg' => !empty($exception) ? $exception->getMessage() : NULL 
      ) 
     ); 

     $model->setTerminal(true); 

     $e->setResult($model); 
     $e->setViewModel($model); 
     $e->getResponse()->setStatusCode($httpCode); 
    } 

} 

我認爲ApiErrorListener應該是一個監聽器,或者說它是一個觀察者。爲什麼必須實現attach()函數?

Observer Design Pattern

在這個環節,你可以看到,只有主題(廣播附加或分離聽衆)。 我覺得我很困惑...

任何人都請幫忙。

在此先感謝。

回答

0

AbstractListenerAggregate提供附加/分離具有相似範圍和目的的一組事件的功能。

它比功能更像是一個組織類。它提供了一種簡單的方法來附加和分離事件。在事件分離的情況下,它提供了一種簡單的方法來分離一組事件,而不需要任何複雜的邏輯來遍歷所有註冊的事件並找到您正在查找的事件。

您不必使用偵聽器聚合,您可以在應用程序中的任何位置將事件附加到EventManager。但是,隨着應用程序的增長,越來越多的事件具有越來越多的依賴關係,它可以爲您的事件邏輯提供一些理智(和可測試性)。