2009-11-25 158 views
5

我花了很多时间试图让这个工作。而我越来越绝望。 如果有人可以帮助我:)Zend Framework:如何禁用默认路由?

目前使用Zend Framework 1.9.5,尽管我一直在努力让这个版本适用于很多版本。

我想要做的是通过XML配置提供我自己的路线,并确保在我的配置中定义的所有而不是都会以errorController结束。 (优选的方式,所以我可以EM除了EXCEPTION_NO_CONTROLLEREXCEPTION_NO_ACTION

我计算,这意味着我必须摆脱默认/的:模块/:控制器/:动作和/:控制器/:动作路线。

所以,当我告诉路由器removeDefaultRoutes(),它不会再匹配这些默认路由。但现在的路由器,现在路由到defaultcontroller :: DEFAULTACTION每未布线路径(什么?)

$front->getRouter()->removeDefaultRoutes(); 

所以任何人都知道如何使FrontController设计(或它的一部分)抛出一个异常当一个URI不能被路由?

原因我想这样做是为了防止重复的内容,并有较好的404页(在这种情况下,没有控制器/不采取行动的错误实际上是应用程序错误,而不是未找到)

回答

5

你尝试加入像

$route = new Zend_Controller_Router_Route('*', array('controller'=>'error', 'module'=>'default', 'action'=>'error')); 


$router->addRoute('default', $route); 

您需要首先添加此路由,因为它需要是最后处理。

+0

好的,这是我所做的。这很有效,因为在那个动作中,我抛出一个异常,表示404。 这仍然是一个解决方法,但是感谢帮助队友 – Maurice 2009-12-29 11:45:58

2

及时一年后快进... (时间旅行音乐)

这里的另一种方式,我认为是要少得多“侵扰”。你可以编写一个插件来捕获默认路由,当发生这种情况时,只需在整个周期结束时抛出一个异常,并由前端控制器将其转换为404。

class Application_Plugin_DisableDefaultRoutes extends Zend_Controller_Plugin_Abstract 
{ 
    public function routeShutdown(Zend_Controller_Request_Abstract $request) 
    { 
     $front = Zend_Controller_Front::getInstance(); 
     $currentRoute = $front->getRouter()->getCurrentRouteName(); 
     if ($currentRoute == 'default') { 
      throw new Exception('Default route is disabled'); 
     } 
    } 
} 

可以在bootstrap.php中

protected function _initPlugins() 
{ 
    $front = Zend_Controller_Front::getInstance(); 
    $front->registerPlugin(new Application_Plugin_DisableDefaultRoutes()); 
} 

加载插件用这种方式,你可以加载插件生产机器和离开它在发展,你可能想使用默认路由快速测试或其他东西。

+0

谢谢你,我正在学习ZF,你的例子很有帮助。 – 2012-02-27 12:43:09

+0

谢谢,我发现ZF1的插件系统非常方便和强大。还没有到处尝试ZF2。 – Julian 2012-02-28 00:31:17