2010-03-25 60 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,否则处理所有路由。这可能是角色和责任方面的最佳选择,但也是最复杂的实施方式。

相关问题