3

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

我究竟做错了什么?谢谢。

4

2 回答 2

3

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

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

于 2012-04-19T21:01:00.407 回答
0

我认为解决方案在有关路由的面包店文章中有所描述- “将参数传递给操作”(代码未测试):

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
}

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

于 2012-04-18T20:10:39.447 回答