通过PageController路由所有请求,但现有控制器除外(Zend Framework)

时间:2010-03-25 23:05:29

标签: php zend-framework routing

对于新的CMS,我开发了一个Pages模块,允许我管理网站的树结构。每个页面都可以从URL http://www.example.com/pageslug/访问,其中pageslug标识正在调用的页面。

我现在想要实现的是一条允许我将所有传入请求路由到单个PagesController的路由,除非它是对现有控制器的请求(例如图像)。

很容易捕获对Pages Controller的所有请求但是如何排除现有的控制器? 这是我的模块引导程序。我怎样才能以最优惠的方式实现这一目标

<?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')
            )
        );

    }

}

2 个答案:

答案 0 :(得分:3)

Zend路线按顺序工作 - 如果您在第一条路线之后添加第二条路线,则优先于,如果匹配。在我自己的Zend项目中,我有一堆路线,第一个路线与你的路线非常相似,是一条全线路。但是,它下面与url匹配的任何内容都会覆盖它 - 所以只需尝试添加稍微更具体的路由(如果你的所有/用户/请求都转到你的user_controller,添加/ user / *路由)

答案 1 :(得分:3)

将页面控制器设置为默认值,并为每个现有控制器添加路径可能会非常快速地变得非常混乱,并且每次添加控制器时都必须更改它。

另一种方法是自定义ErrorController。由于在缺少控制器的情况下,框架将抛出​​Zend_Controller_Dispatcher_Exception,它将作为EXCEPTION_NO_CONTROLLER传播到错误处理程序,您只需检查该类型并转发到您的页面控制器。 / p>

如果您感觉自虐,您还可以编写一个自定义路由类,如果控制器存在则返回false,否则处理所有路由。这可能是角色和职责方面的最佳选择,也是最复杂的选择。