2012-12-25 36 views
1

我想匹配用戶未記錄到控制器Admin\Controller\Sign和動作in的所有請求。我寫在onBootstrap()方法這段代碼Module.php文件:Zend Framework 2 - 爲什麼我無法重寫MvcEvent的MatchRoute?

if (!$authService->hasIdentity()) { 
    $routeMatch = new RouteMatch(
     array(
      'controller' => 'Admin\Controller\Sign', 
      'action'  => 'in' 
     ) 
    ); 

    $event->setRouteMatch($routeMatch); 
} 

我沒有得到任何錯誤,但代碼不能正常工作,爲什麼?

回答

4

問題這裏是在(MvcEvent :: EVENT_BOOTSTRAP)之後觸發應用程序路由事件(MvcEvent :: EVENT_ROUTE)。 這意味着即使您在引導級別設置了路由匹配,應用程序將在MvcEvent :: EVENT_ROUTE之後使用請求的路由匹配覆蓋它。

如果你想避免這種壓倒一切,你需要添加一個偵聽器路徑事件以非常低的優先級,以確保它不會被覆蓋:

$e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_ROUTE, array($this, 'onRouteEvent'), -1000000);

注:onRouteEvent會處理路由事件的Module類的方法(類似於您的代碼)。

如果你想短路在引導級別上運行應用程序時,你所能做的就是用重定向代碼發送的報頭到客戶端:

//get the url of the login page (assuming it has route name 'login') 
$url = $e->getRouter()->assemble(array(), array('name' => 'login')); 
$response=$e->getResponse(); 
$response->getHeaders()->addHeaderLine('Location', $url); 
$response->setStatusCode(302); 
$response->sendHeaders(); 
+1

第一種方式很好,適合我,謝謝。 –

+0

不客氣。 – yechabbi

+2

而不是低優先級,您可以使用更高的優先級和'$ e-> stopPropagation(true);'如果您想覆蓋正常行爲。它應該不必處理路線兩次。 http://framework.zend.com/apidoc/2.1/classes/Zend.EventManager.Event.html#stopPropagation – Chris

1

在module.config.php的航線部在控制器添加路由條目sign_in如下下管理模塊

'sign_in' => array(
    'type' => 'Segment', 
    'options' => array(
     'route' => '/admin/sign/in', 
     'defaults' => array(
      'controller' => 'sign', 
      'action'  => 'in', 
     ), 
    ), 
), 

和呼叫路由這樣

$this->redirect()->toRoute('sign_in'); 
+0

我不想重定向,但由於爲答案。 –