我有一个控制器设置来接受两个变量:/clients/view/var1/var2
我想把它展示为/var1/var2
所以我试过
了Router::connect('/*', array('admin'=>false, 'controller' => 'clients', 'action' => 'view'));
但这会使所有其他控制器停止工作,因为/*
路由所有内容
网站上的所有其他页面都在admin
前缀内,所以基本上我需要一条路由,如果当前前缀admin
,则忽略该路由!我试过这个(正则表达式来自正则表达式以匹配不包含单词的行?
Router::connect('/:one', array('admin'=>false, 'controller' => 'clients', 'action' => 'view'), array(
'one' => '^((?!admin).*)$'
));
但我认为正则表达式不正确,因为如果我导航到/test
它会要求测试控制器,而不是客户端
我唯一的其他路线是:
Router::connect('/admin', array('admin'=>true, 'controller' => 'clients', 'action' => 'index'));
Router::connect('/', array('admin'=>false, 'controller' => 'users', 'action' => 'login'));
我做错了什么?谢谢。
我第一次误解了你的问题。我测试了您的代码,也没有得到预期的结果。原因可能是正则表达式解析器不支持负的前瞻断言。但我仍然认为您可以通过重新排序路由来解决此问题:
CakeBook 描述了在使用前缀路由时自动生成哪些路由。在您的情况下,必须在"/*"路由之前手动分配这些路由,以捕获所有管理员操作。这是对我有用的代码:
// the previously defined routes
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::connect('/admin', array('controller' => 'clients', 'action' => 'index', 'admin' => true));
// prefix routing default routes with admin prefix
Router::connect("/admin/:controller", array('action' => 'index', 'prefix' => 'admin', 'admin' => true));
Router::connect("/admin/:controller/:action/*", array('prefix' => 'admin', 'admin' => true));
// the 'handle all the rest' route, without regex
Router::connect(
'/*',
array('admin'=>false, 'controller' => 'clients', 'action' => 'view'),
array()
);
现在,我使用管理员前缀获取所有管理控制器操作,并且/test1/test2 被重定向到客户端控制器。
我认为解决方案在面包店关于路由的文章中进行了描述 - "将参数传递给操作"(代码未测试):
Router::connect(
'/clients/view/:var1/:var2/*',
array(
'controller' => 'clients',
'action' => 'view'
),
array(
'pass' => array(
'var1',
'var2'
)
)
);
控制器操作如下所示:
public function view($var1 = null, $var2 = null) {
// do controller stuff
}
此外,您还要查看路线的顺序(请阅读"路线的顺序很重要"部分)。在您的示例中,如果"/*"首先出现,则停止所有其他路由,如果您在其他路由之后分配规则,则它仅处理与任何其他路由不匹配的请求。