2

我正在使用基于 url 的语言,并且我在 URL 中有一个带有传入参数的页面。

我不喜欢 URL 中的查询字符串 ('?x=y') 或命名参数 ('x:y'),所以我使用http://localhost/cakeapp/us/controller/action/param1/param2/param3

在我的AppController中,我正在检查 URL 是否定义了语言,如果没有定义语言(例如用户请求http://localhost/cakeapp/controller/action/param1/param2/param3),那么我想简单地重定向用户到具有相同参数的语言定义的 URL。

简而言之:我想重定向:

http://localhost/cakeapp/controller/action/param1/param2/param3

http://localhost/cakeapp/us/controller/action/param1/param2/param3

我用;

$this->重定向(

Router::url(array('language' => $this->Session->read('Config.language'), 'base' => false))

);

但它会将用户重定向到http://localhost/cakeapp/us/controller/action而没有参数。

有没有办法使用 Router::url 和传入的$this->passedArgs变量来构建 url。

4

2 回答 2

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]
);
于 2012-11-12T11:14:29.193 回答
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));
于 2012-11-17T13:46:31.350 回答