Zend Framework:如何禁用默认路由?

时间:2009-11-25 14:33:15

标签: zend-framework routing url-routing front-controller

我花了很多时间试图让它发挥作用。我变得非常绝望。 如果有人可以帮助我,那会很棒。)

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

我想要做的是通过XML配置提供我自己的路由,并确保我的配置中定义的的所有内容都将在我的errorController上结束。 (最好以某种方式使我与EXCEPTION_NO_CONTROLLEREXCEPTION_NO_ACTION

分开

我认为这意味着我必须摆脱默认的/:module /:controller /:action和/:controller /:action routes。

因此,当我告诉路由器删除DebaultRoutes()时,它将不再匹配这些默认路由。但是现在路由器现在将每个未路由的路由路由到defaultcontroller :: defaultaction(什么??)

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

那么,任何人都知道如何在无法路由URI时使前控制器(或其中的一部分)抛出异常?

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

2 个答案:

答案 0 :(得分:5)

您是否尝试添加新路线,例如

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


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

您需要先添加此路线,因为它需要是最后一次处理。

答案 1 :(得分: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());
}

通过这种方式,您可以在生产计算机中加载插件,并将其保留在开发中,您可能希望使用默认路由进行快速测试或其他操作。