如何在CakePHP中以最清晰的方式添加前缀到每个URL,比如一种语言参数?
http://example.com/en/controller/action
http://example.com/ru/admin/controller/action
它需要与像admin
这样的“真实”前缀一起工作,并且理想情况下,裸的URL /controller/action
可以重定向到/DEFAULT-LANGUAGE/controller/action
。
现在对于我来说在一个改装后的应用程序中运行良好,但它有点像黑客一样,我需要手动在大多数链接中包含语言参数,这不好。
因此,问题有两个方面:
- 最佳方法是什么,使得语言参数默认情况下被隐式地包括而不必为每个新定义的路由指定?
Router::connect('/:controller/:action/*', ...)
应该隐式包括前缀。- 该参数应该可在类似
$this->params['lang']
或其他类似位置中使用,并在AppController::beforeFilter()
中进行评估。
- 如果未明确指定,如何获取
Router::url()
自动包括前缀在URL中?Router::url(array('controller' => 'foo', 'action' => 'bar'))
应返回/en/foo/bar
- 由于Controller::redirect()、Form::create()甚至直接需要具有相同行为的Router::url(),因此覆盖每个函数并不是真正的选项。但是,例如,Html::image()应产生没有前缀的URL。
以下方法似乎会调用Router::url
。
Controller::redirect
Controller::flash
Dispatcher::__extractParams
通过Object::requestAction
Helper::url
JsHelper::load_
JsHelper::redirect_
View::uuid
,但仅用于哈希生成
从中看来,控制器和助手方法需要被覆盖,我可以在AppController或者可能只是bootstrap.php中编写一个通用函数来处理参数插入。覆盖的控制器和助手方法将使用此功能,如果我想手动调用Router::url,则我也会使用此功能。这足够吗?