2011年(109)
分类: 系统运维
2011-05-19 16:08:59
因为URL_REWRITE比较特殊,需要服务器支持,所以下面的例子不涉及URL_REWRITE,所以比较具有通用性。
例子说明如下:
如果我们有一个City模块,而我们希望能够通过类似下面这样的URL地址来访问具体某个城市的操作:
一、使用URL路由功能实现
由于shanghai这个操作方法是不存在的,我们给相关的城市操作定义了一个city方法,如下:
复制代码
接下来我们来定义路由文件,实现类似于
这样的解析,路由文件名称是routes.php 放在项目的Conf目录下面,内容如下:
Return array(
‘City’=>array(‘City’,’city’,’name’);
);
这样,URL里面所有的City模块(其实已经不是City模块了,而是一个路由定义)都会被路由到City模块的city操作,而后面的第二个参数会被解析成 $_GET[‘name’]
接下来,我们就可以在浏览器里面输入
会看到依次输出的结果是:
当前城市:beijing
当前城市:shanghai
当前城市:shenzhen
二、空操作实现
同样是上面的例子,我们用空操作的思路来实现。
我们定义了一个CityAction类,代表了City模块,而我们希望能够通过类似下面这样的URL地址来访问具体某个城市的操作:
由于第二个参数表示的含义是City模块的操作名称,我们不可能给每个城市都定义一个操作方法,那样的工作量将是相当巨大的(尤其是在中国,呵呵~),当 然,我们可以利于URL路由功能来解决这个问题。但是我们还可以用空操作来更加高效地解决这个问题,我们来看下具体如何实现。
我们只需要给CityAction类定义一个_emtpy (空操作)方法:
Class CityAction extends Action{
Public function _empty(){
// 把所有城市的操作都解析到city方法
// 注意city方法本身是protected方法
$cityName = ACTION_NAME;
$this->city($cityName);
}
Protected function city($name){
// 和$name 这个城市相关的处理
Echo (‘当前城市:’.$name);
}
}
接下来,我们就可以在浏览器里面输入
会看到依次输出的结果是:
当前城市:beijing
当前城市:shanghai
当前城市:shenzhen
三、空模块实现
现在需求进一步,要求我们把URL由原来的
变成
这样更加简单的方式,如果按照传统的模式,我们必须给每个城市定义一个Action类,然后在每个Action类的index方法里面进行处理。
可是如果使用空模块功能,这个问题就可以迎刃而解了。
我们可以给项目定义一个EmptyAction类
Class EmptyAction extends Action{
Public function index(){
// 根据当前模块名称来判断要执行哪个城市的操作
$cityName = MODULE_NAME;
$this->city($cityName);
}
Protected function city($name){
// 和$name 这个城市相关的处理
Echo (‘当前城市:’.$name);
}
}
接下来,我们就可以在浏览器里面输入
会看到依次输出的结果是:
当前城市:beijing
当前城市:shanghai
当前城市:shenzhen