ZF前端和后端路由

时间:2012-08-21 12:21:40

标签: zend-framework routing routes

我想要的东西对我来说听起来很简单,但似乎不是。

我的问题是我的申请需要2条路线:

每当模块为admin时,请应用以下路线:

$router->addRoute(
            'backend',
            new Zend_Controller_Router_Route('/:module/:controller/:action/:id/:value', array('module' => 'admin', 'controller' => 'dashboard', 'action' => 'index', 'id' => ':id', 'value' => ':value'))
        );

哪个效果很好。示例网址可以是:http://localhost/server/domains/demo/admin/images/album/3,其中admin是模块,控制器映像等等。

我想要的是,当用户转到http://localhost/server/domains/demo时,他会被重定向到default moduleindex controllerindex actiondemo/之后的所有内容都应被视为单个参数(可能包含未知/)。

我尝试了几件事,从使用Route_Regex,尝试(.*)(\d+),我在网上找到的东西。尝试切换值,使它们静止,打开/关闭removeDefaultRouter,但没有任何效果。下面你可以看到我目前的引导程序。有什么想法吗?

$router = $this->frontController->getRouter();
    $router->removeDefaultRoutes();
    $router->addRoute(
        'backend',
        new Zend_Controller_Router_Route('/admin/:controller/:action/:id/:value', array('module' => 'admin', 'controller' => 'dashboard', 'action' => 'index', 'id' => ':id', 'value' => ':value'))
    );

    $router->addRoute(
        'frontend',
        new Zend_Controller_Router_Route('/default/:controller/:action/(.*)', array('module' => 'default', 'controller' => 'index', 'action' => 'index'))
    );

后端工作正常,但在http://localhost/server/domains/demo/时,我收到以下错误:No route matched the request

当得到答案时,请解释原因,因为Zend_Route对我来说总是有点模糊。提前谢谢!

临时修复

在我使用的临时修复程序之下。它完全符合我的要求,但我仍然相信Zend_Route可以实现同样的目的,而无需检查模块是否为管理员。

$router = $this->frontController->getRouter();
    $uri = explode('demo/', $_SERVER['REQUEST_URI']);
    $uri = (isset($uri[1])) ? explode('/', $uri[1]) : $uri[0];
    if($uri[0] == 'admin')
    {
        $route = new Zend_Controller_Router_Route('/:module/:controller/:action/:id/:value', array('module' => 'admin', 'controller' => 'dashboard', 'action' => 'index', 'id' => null, 'value' => null));
        $router->addRoute('router', $route);
    }
    else
    {
        $route = new Zend_Controller_Router_Route('/*', array('module' => 'default', 'controller' => 'index', 'action' => 'index'));
        $router->addRoute('router', $route);
    }

1 个答案:

答案 0 :(得分:0)

如果你真的必须使用这条路线,这是值得做的。对于正常使用,您只需通过

生成链接
Zend_Layout::getMvcInstance()->getView()->Url(array('module' => 'admin'));
Zend_Layout::getMvcInstance()->getView()->Url(array('module' => 'default'));

等等。


如果您对此不满意,请尝试路由链接:

    $router = Zend_Controller_Front::getInstance()->getRouter();

    $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
    $request = Zend_Controller_Front::getInstance()->getRequest();
    $frontRoute = new Zend_Controller_Router_Route_Module(array(), $dispatcher, $request);
    $backRoute = new Zend_Controller_Router_Route_Module(array('module' => 'admin'), $dispatcher, $request);

    $route = new Zend_Controller_Router_Route('admin');
    $router->addRoute('backend', $route->chain($backRoute));

    $route = new Zend_Controller_Router_Route('default');
    $router->addRoute('frontend', $route->chain($frontRoute));


Explenation:
Zend_Controller_Router_Route_Module用于定义应用程序的模块路由。通过将其链接到new Zend_Controller_Router_Route('admin')这样的正常路线,您可以创建/ admin / [your_module_route]等链接,其中[your_module_route]已定义默认值array('module' => 'admin'),也可以采用其他参数。

new Zend_Controller_Router_Route_Module(array(), $dispatcher, $request);被定义为标准路由器上的默认路由。