问题描述:
需要对url进行自定义,保存到数据库中。
例如,id为1的blog文章,默认的路由是 /post/view&id=1,而我需要把他设置为 /my-first-blog 。
要实现这样的功能,应该如何对CUrlManager进行扩展,请提供一下思路。
我看到drupal的是把url alias和控制器的关系保存在一个表里面,但是具体的实现方式没弄懂。
谢谢。
问题描述:
需要对url进行自定义,保存到数据库中。
例如,id为1的blog文章,默认的路由是 /post/view&id=1,而我需要把他设置为 /my-first-blog 。
要实现这样的功能,应该如何对CUrlManager进行扩展,请提供一下思路。
我看到drupal的是把url alias和控制器的关系保存在一个表里面,但是具体的实现方式没弄懂。
谢谢。
没看明白
疑惑之处: 我是希望可以整站都可以实现自定义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跳转的话,要分三步来走了。
创建MyWebApplication.php,继承于CWebApplication,覆盖runController()方法,在里面对url进行处理,比如说判断controller不存在的话,全初始化为PostController(不过这样你就要在post里面那CHttpException处理了)。
创建MyYiiBase.php,继承于YiiBase,覆盖createWebApplication($config=null),让它初始化MyWebApplication,而不是初始化CWebApplication。
修改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进行处理的。
其实说到底,无论是用什么方法,就是要对请求进行拦截,然后再处理。