2009-11-19 50 views
0

我已經完成了CMS的一半,其中的URL是一個基於頁面標題的搜索引擎優化友好名稱。有一部分需要使用特定的控制器。因此,例如:如何在Zend Framework中動態更改控制器?

test.com/page1(使用索引控制器) test.com/page2(使用索引控制器) test.com/page3(使用不同的控制器) test.com/page4(使用索引控制器)

我可以添加一條路線,說「page3」將使用「不同」控制器,但CMS的用戶需要能夠更改URL的名稱和seo,因此它當前是「page3」 「稍後它可能會被改變,這會破壞我的路由規則。

什麼是最好的方法(無論是前端控制器插入或其他)來抓住請求,並從數據庫中拉出要使用的控制器(SQL會像「選擇控制器從菜單,其中seo ='page3'」),那麼在Zend設置要使用的控制器之前將它設置爲控制器?

任何幫助或洞察力非常感謝。

回答

1

您必須創建一個控制器插件並在請求對象上設置模塊/控制器/操作。

然後在preDispatch()方法,你可以這樣做:

public function preDispatch(Zend_Controller_Request_Abstract $request) 
{ 
    $request->setModuleName($this->_getModule()); 
    $request->setControllerName($this->_getController()); 
    $request->setActionName($this->_getAction()); 
} 

然後你就可以創建方法__getModule(),_getController(),_getAction(),將檢查$ _ SERVER ['REQUEST_URI ']和您的數據庫,並設置適當的模塊/控制器/操作。

+0

感謝您的回覆。 你提到的函數應該是否是frontController插件的一部分? 假設我使插件名爲updateControllerSeo,那麼函數preDispatch和_getController將成爲該類插件的一部分? 再次感謝。 – Ben 2009-11-19 19:36:30

+0

是的。他們應該在插件。但我會建議把它們放在routeShutdown()中,因爲在這種情況下,它們會在每個動作之前被調用(如果你使用動作視圖hleper,或者...) – 2009-11-19 22:26:31

+0

在插件中創建所有這些方法。如果它們不在你的插件類中,你不能用($ this)調用它們。並且需要preDispatch()或routeShutdown(),因爲它們是在調度週期內調用的「掛鉤」 – 2009-11-20 09:33:27

相關問題