我正在使用基于网址的语言,并且我在网址中有一个包含传入参数的页面。
我不喜欢在URL中查询字符串('?x = y')或命名params('x:y'),所以我使用 http:// localhost / cakeapp / us / controller / action / param1 /参数2 /参数3
在我的 AppController 中,我检查URL是否已定义语言,如果没有定义语言(例如用户请求 http:// localhost / cakeapp / controller / action / param1 / param2 / param3 )然后我想简单地将用户重定向到具有相同参数的语言定义的URL。
简而言之: 我想重定向:
的http://本地主机/ cakeapp /控制器/动作/参数1 /参数2 /参数3
到
的http://本地主机/ cakeapp / US /控制器/动作/参数1 /参数2 /参数3
我用;
$这 - >重定向(
Router :: url(array('language'=> $ this-> Session-> read('Config.language'),'base'=> false))
);
但它会将用户重定向到 http:// localhost / cakeapp / us / controller / action 而不带参数。
有没有办法使用带有传入 $ this-> passedArgs 变量的Router :: url构建网址。
答案 0 :(得分:0)
我认为您需要确保将参数传递给重定向方法:
function controllerAction($param1, $param2, $param3) {
$this->redirect(
Router::url(array('language' => $this->Session->read('Config.language'), 'base' => false)),
$param1,
$param2,
$param3
);
}
或者至少以某种方式将参数传递给重定向方法,无论哪种方式最适合您。我认为你也可以这样做,如果你没有直接将参数作为参数传递给你的控制器动作方法:
$this->redirect(
Router::url(array('language' => $this->Session->read('Config.language'), 'base' => false)),
$this->request->params['named'][0],
$this->request->params['named'][1],
$this->request->params['named'][2]
);
答案 1 :(得分:0)
这应该有效:
Router::connect(
'/cakeapp/:language/:controller/:action/*',
array(),
array('language'=>'[a-z]{2}')
);
Router::redirect(
'/*',
'/cakeapp/us/'.substr(Router::url(null, false),
strpos(Router::url(null, false), '/', 1))
);
如果您没有应用前缀,则可以省略第二行中的字符串操作;像这样:
Router::connect(
'/:language/:controller/:action/*',
array(),
array('language'=>'[a-z]{2}')
);
Router::redirect('/*', '/us/'.Router::url(null, false));