如何自定义路由

问题描述:

需要对url进行自定义,保存到数据库中。

例如,id为1的blog文章,默认的路由是 /post/view&id=1,而我需要把他设置为 /my-first-blog 。

要实现这样的功能,应该如何对CUrlManager进行扩展,请提供一下思路。

我看到drupal的是把url alias和控制器的关系保存在一个表里面,但是具体的实现方式没弄懂。

谢谢。

我之前的帖子应该对你有用

http://www.yiiframework.com/forum/index.php?/topic/12708-有人用做过和处理过friendly-url的吗?/page__p__62183__fromsearch__1#entry62183

没看明白 :-[

疑惑之处: 我是希望可以整站都可以实现自定义url,没有自定义的话则跳到默认的url规则。

比如

/my-way 是指向creatUrl(‘category/my’)

/my-another-way 是指向creatUrl(‘post/view’,array(‘id’=>9))

你要在route里面把

‘<titile:.*?>’=>‘post/view’,

放到最后,因为这是最后才去匹配的,而你在post/view里面做的是,根据名字(my-way,或者 my-another-way)从post数据表里面提取数据。

不过我明白你的意思,你是想像drupal那样全站url匹配,不过你要注意的是,在drupal,它是统一用node来放置内容的,所以它的处理方式简单一点,都是从node表对比拿数据。

这种情况在Yii里面要正如你所说,自己写CUrlManager,通过分析请求的路径从数据表里面提数据。

刚刚看源码,人工debug(就是一个一个文件打开来看。。。囧)了一下Yii的加载过程,发现它初始化controller是在

framework/web/CWebApplication.php的runController()和createController()这两个方法里面。

如果要做整站的url跳转的话,要分三步来走了。

  1. 创建MyWebApplication.php,继承于CWebApplication,覆盖runController()方法,在里面对url进行处理,比如说判断controller不存在的话,全初始化为PostController(不过这样你就要在post里面那CHttpException处理了)。

  2. 创建MyYiiBase.php,继承于YiiBase,覆盖createWebApplication($config=null),让它初始化MyWebApplication,而不是初始化CWebApplication。

  3. 修改framework/yii.php,让Yii这个class继承于MyYiiBase。

这样做应该就可以了

大概的思路是这样子,没有实际写过这样的代码,希望有更权威的做法~ :)

非常感谢,我认真看看。

刚才有时间,再看了一次Yii,貌似用onBeginRequest也能做到。

在main.php里面设置:




'onBeginRequest' => array('MyBeginRequest', 'beginRequest'),


'components'=>array(

    //其它代码。



MyBeginRequest.php 放到protected/components,代码如下:




<?php 

class MyBeginRequest

{

  public static function beginRequest()

  {

    Yii::app()->runController('post');

    Yii::app()->end();

  }

}



这样在Yii运行的时候,会调用MyBeginRequest里面的beginRequest,这样的话,可以在里面根据url进行处理的。

其实说到底,无论是用什么方法,就是要对请求进行拦截,然后再处理。