对于新的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')
)
);
}
}
答案 0 :(得分:3)
Zend路线按顺序工作 - 如果您在第一条路线之后添加第二条路线,则优先于,如果匹配。在我自己的Zend项目中,我有一堆路线,第一个路线与你的路线非常相似,是一条全线路。但是,它下面与url匹配的任何内容都会覆盖它 - 所以只需尝试添加稍微更具体的路由(如果你的所有/用户/请求都转到你的user_controller,添加/ user / *路由)
答案 1 :(得分:3)
将页面控制器设置为默认值,并为每个现有控制器添加路径可能会非常快速地变得非常混乱,并且每次添加控制器时都必须更改它。
另一种方法是自定义ErrorController。由于在缺少控制器的情况下,框架将抛出Zend_Controller_Dispatcher_Exception
,它将作为EXCEPTION_NO_CONTROLLER
传播到错误处理程序,您只需检查该类型并转发到您的页面控制器。 / p>
如果您感觉自虐,您还可以编写一个自定义路由类,如果控制器存在则返回false,否则处理所有路由。这可能是角色和职责方面的最佳选择,也是最复杂的选择。