2011-11-01 82 views
1

我目前正在研究CakePHP 2.0并希望将旧的1.3项目转换为2.0。我将从头开始,因为项目中有很多代码可能会更好。CakePHP(2.0)动态网址

其中之一就是动态网址,多种语言的项目,甚至网址都会变成所选语言。例如:

英语:/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则没有那么不同。

回答

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。