6

我花了很多时间试图让它工作。我越来越绝望了。如果有人可以帮助我,那就太好了:)

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

我想要做的是通过 XML 配置提供我自己的路由,并确保我的配置中未定义的所有内容都在我的 errorController 上结束。EXCEPTION_NO_CONTROLLER(最好以某种方式让我可以将它们与and分开EXCEPTION_NO_ACTION

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

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

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

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

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

4

2 回答 2

5

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

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


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

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

于 2009-12-01T19:51:58.167 回答
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());
}

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

于 2011-07-24T17:11:02.987 回答