2010-03-25 67 views
4

對於新的CMS,我開發了一個頁面模塊,它允許我管理網站的樹結構。每個頁面都可從URL http://www.example.com/pageslug/到達,其中Pagelug標識正在調用的頁面。通過PageController路由除現有控制器之外的所有請求(Zend Framework)

我現在想要實現的是一種路由,它允許我將所有傳入請求路由到單個PagesController,除非它是對現有控制器(例如圖像)的請求。

向頁面控制器發送所有請求很容易,但如何排除現有的控制器? 這是我的模塊引導程序。我如何能在最preferrable方式

<?php 

class Default_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 

    protected function _initRoute() 
    { 
     $this->bootstrap('frontController'); 

     /* @var $frontcontroller Zend_Controller_Front */ 
     $frontcontroller = $this->getResource('frontController'); 

     $router = $frontcontroller->getRouter(); 
     $router->addRoute(
      'all', 
      new Zend_Controller_Router_Route('*', 
       array('controller' => 'pages', 
         'action'  => 'view') 
      ) 
     ); 

    } 

} 
+0

很好的問題,我沒有找到適合這種情況的解決方案 - 我使用黑客和技巧,我認爲最優雅的方式是「編寫自定義路由類」,如第二回答中推薦的 – 2010-03-29 10:13:13

回答

3

Zend的路線,以工作實現這一點 - 如果你以後第一次添加第二條路線,它會如果匹配優先。在我自己的Zend項目中,我有很多路線,其中第一條與您的路線非常相似,抓住了所有路線。然而,它下面的任何匹配的網址覆蓋它 - 所以只是嘗試添加更具體的路線(如果所有/用戶/請求去你的user_controller,添加一個/用戶/ *路線)

+0

謝謝,聽起來像一個計劃! – ChrisR 2010-03-25 23:13:41

3

使您的頁面控制器默認,並且爲每個現有控制器添加路由可能會非常迅速地變得非常混亂,並且每次添加控制器時都必須更改它。

另一種可能是定製ErrorController。由於在控制器丟失的情況下,框架將拋出​​一個Zend_Controller_Dispatcher_Exception作爲EXCEPTION_NO_CONTROLLER傳播到錯誤處理程序,您可以檢查該類型並轉發給您的頁面控制器。

如果你感覺受虐狂,你也可以編寫一個自定義路由類,如果控制器存在則返回false,否則處理所有路由。這可能是角色和責任方面的最佳選擇,但也是最複雜的實施方式。

相關問題