带有正则表达式的 CakePHP 路由


CakePHP route with regex

我有一个控制器设置来接受两个变量:/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
}

此外,您还要查看路线的顺序(请阅读"路线的顺序很重要"部分)。在您的示例中,如果"/*"首先出现,则停止所有其他路由,如果您在其他路由之后分配规则,则它仅处理与任何其他路由不匹配的请求。