编程语言
首页 > 编程语言> > 使用正则表达式的CakePHP路由

使用正则表达式的CakePHP路由

作者:互联网

我有一个控制器设置来接受两个变量:/ clients / view / var1 / var2

我想将其显示为/ var1 / var2

所以我尝试了

Router::connect('/*', array('admin'=>false, 'controller' => 'clients', 'action' => 'view'));

但这会停止所有其他控制器的工作,因为/ *路由所有内容

该站点上的所有其他页面都在admin前缀内,因此基本上,如果当前前缀为admin,我需要忽略的路由!我尝试了这个(正则表达式来自Regular expression to match a line that doesn’t contain a word?):

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 describes which routes are automatically generated if you use prefix routing.在您的情况下,必须在“ / *”路由之前手动分配这些路由,以捕获所有管理员操作.这是对我有用的代码:

// 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()
);

现在,我获得了所有带有admin前缀的管理控制器操作,并且/ test1 / test2被重定向到客户端控制器.

标签:routes,cakephp,php,regex
来源: https://codeday.me/bug/20191201/2080896.html