我目前正在研究CakePHP 2.0,并希望将旧的1.3项目转换为2.0。我将从头开始,因为项目中有很多代码可以更好。
其中一个是动态URL,项目多语言甚至URL都会更改为所选语言。例如:
英语:/pages/new-article
荷兰语:/paginas/nieuw-artikel
两者都会转到PagesController::display();
注意:网址可以更长,网页可以包含子页面,这些也会添加到网址中。例如:/pages/new-article/article-subpage
现在,我之前采用的方式是为所有事情做一个特定行动的路线。喜欢*前往PagesController::index();
然而,这似乎会减慢应用程序的速度,并带来很多问题。
所以我的问题是,有更简单的方法吗?
我不想对任何内容进行硬编码,我应该可以将/pages/article
更改为/page/article
,而无需更改代码。
注意:如果你知道在1.2或1.3中做到这一点的方法,那也会很棒,2.0也没有那么不同。
答案 0 :(得分:5)
好吧我明白了,显然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;
}
}
在APP/Config/routes.php
中,你提出以下内容:
App::import('Lib', 'Routing/Route/UrlRoute');
Router::connect('/*', array('controller' => 'tests', 'action' => 'index'), array('routeClass' => 'UrlRoute'));
我认为真正的挑战是让通常传递给函数的参数恢复工作。 func_get_args()
现在返回域名后面的所有内容。如果您正在使用额外的参数,则从数据库中检索URL。可能必须缓存每个URL。