CakePHP路由与正则表达式

时间:2012-04-18 16:30:01

标签: php regex cakephp routes

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

我做错了什么?感谢。

2 个答案:

答案 0 :(得分:3)

我第一次误解了你的问题。我测试了你的代码,但也没有得到预期的结果。原因可能是正则表达式解析器不支持否定先行断言。但我仍然认为你可以通过重新排序路线来解决这个问题:

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重定向到客户端控制器。

答案 1 :(得分:0)

我认为解决方案在面包店article on routing中描述 - “将参数传递给操作”(代码未经测试):

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
}

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