Kev*_*rne 1 php cakephp url-routing
我目前正在研究CakePHP 2.0,并希望将旧的1.3项目转换为2.0.我将从头开始,因为项目中有很多代码可以更好.
其中一个是动态URL,项目多语言甚至URL都会更改为所选语言.例如:
英语:/pages/new-article
荷兰语:/paginas/nieuw-artikel
两者都会去 PagesController::display();
注意:URL可以更长,页面可以有子页面,也可以添加到URL中.例如:/pages/new-article/article-subpage
现在,我之前采用的方式是为所有事情做一个特定行动的路线.喜欢*去PagesController::index();
然而,这似乎减慢了应用程序的速度,并带来了很多问题.
所以我的问题是,有更简单的方法吗?
我不想硬编码任何东西,我应该能够更改/pages/article
为/page/article
无需更改代码.
注意:如果您知道在1.2或1.3中执行此操作的方法,那也将是很好的,2.0并没有那么不同.
好吧,我想通了,显然CakePHP 1.3和2.0允许你创建自定义路由类.它在这里的文档中:http://book.cakephp.org/2.0/en/development/routing.html?highlight=route#custom-route-classes
所以基本上你需要做的是创建一个APP/Lib/Routing/Route/UrlRoute.php
包含以下内容的文件:
class UrlRoute extends CakeRoute{
public function parse($url){
$params = parent::parse($url);
# Here you get the controller and action from a database.
// tmp
$params['controller'] = 'pages';
$params['action'] = 'index';
return $params;
}
}
Run Code Online (Sandbox Code Playgroud)
并在你的APP/Config/routes.php
你提出以下内容:
App::import('Lib', 'Routing/Route/UrlRoute');
Router::connect('/*', array('controller' => 'tests', 'action' => 'index'), array('routeClass' => 'UrlRoute'));
Run Code Online (Sandbox Code Playgroud)
我认为真正的挑战是让通常传递给函数的参数恢复工作.func_get_args()
现在返回域名后面的所有内容.如果您正在使用额外的参数,则从数据库中检索URL.可能必须缓存每个URL.