Zend路由器 - 问题 - 工作但不是希望的

时间:2011-08-12 17:41:24

标签: zend-framework

我的网站需要自定义路线:

所有内容如下:www.site.com/457485789479可以使用参数ID / 45路由到索引/索引。 其他一切应该与zend框架默认值一起使用。

我有这条路线:

resources.router.routes.test.type = "Zend_Controller_Router_Route"
resources.router.routes.test.route = ":id"
resources.router.routes.test.defaults.module = "default"
resources.router.routes.test.defaults.controller = "index"
resources.router.routes.test.defaults.action = "index"
resources.router.routes.test.defaults.id = ""

但是现在,“URL ViewHelper”不起作用,一切都转到“/”,有人看到错误并且可以提供帮助吗?

2 个答案:

答案 0 :(得分:0)

您应该使用Zend_Controller_Router_Route_Regex而不是Router_Route

$router->addRoute('router-name', new Zend_Controller_Router_Route_Regex(
            '(\d{2,})',
            array(
                'controller' => 'index',
                'action' => 'index'
            ),
            array(1 => 'id'),
            '%d'
        ));

答案 1 :(得分:0)

使用example.com/:id之类的自定义路由将覆盖默认路由。这会产生意想不到的后果,因为它们将不再有效example.com/:moduleexample.com/:controller。以下是我为完成您的要求所做的工作。

我想要这个静态页面的URL:

 example.com/about 

同时保持默认路线,这样仍然有效

example.com/:module
example.com/:controller

我这样做的方法是使用插件来测试我的请求是否可以发送。如果无法使用默认路由调度请求,那么我会将请求更改为正确的模块以加载我的页面。这是一个可以根据需要修改的插件:

class My_Controller_Plugin_StaticPageRoute extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
        // Can this request be dispatched
        if (!$dispatcher->isDispatchable($request)) {
            // return if not a single level request
            if ('default' != $request->getModuleName() 
                && 'index' != $request->getActionName()) {
                return;
            }
            // Get param to be used in new request ie. example.com/:param
            $param = $request->getControllerName();
            // Set the request where to try next
            $request->setModuleName('default');
            $request->setControllerName('index');
            $request->setActionName('index');
            $request->setParam('id', $param);

            /** Prevents infinite loop if you made a mistake above **/
            if ($dispatcher->isDispatchable($request)) {
                $request->setDispatched(false);
            }

        }

    }
}