CakePHP(2.0)动态URL

时间:2011-11-01 13:36:46

标签: php cakephp url-routing

我目前正在研究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也没有那么不同。

1 个答案:

答案 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。