我想要的东西对我来说听起来很简单,但似乎不是。
我的问题是我的申请需要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 module
,index controller
和index action
。 demo/
之后的所有内容都应被视为单个参数(可能包含未知/
)。
我尝试了几件事,从使用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);
}
答案 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);
被定义为标准路由器上的默认路由。