Chinaunix首页 | 论坛 | 博客
  • 博客访问: 95603
  • 博文数量: 109
  • 博客积分: 3411
  • 博客等级: 中校
  • 技术积分: 1155
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-01 09:04
文章分类

全部博文(109)

文章存档

2011年(109)

分类: 系统运维

2011-05-19 16:08:59

   我们来通过一个简单的例子,分别用URL路由、空操作和空模块三个角度来实现,由此来看ThinkPHPSEOURL友好的支持到底有多方便。

因为URL_REWRITE比较特殊,需要服务器支持,所以下面的例子不涉及URL_REWRITE,所以比较具有通用性。
例子说明如下:
如果我们有一个City模块,而我们希望能够通过类似下面这样的URL地址来访问具体某个城市的操作:


一、使用URL路由功能实现
由于shanghai这个操作方法是不存在的,我们给相关的城市操作定义了一个city方法,如下:

  1. Class CityAction extends Action{
  2. public function city(){
  3. // 读取城市名称
  4. $cityName = $_GET[‘name’];
  5. Echo (‘当前城市:’.$cityName);
  6. }
  7. }

复制代码

接下来我们来定义路由文件,实现类似于

这样的解析,路由文件名称是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

阅读(309) | 评论(0) | 转发(0) |
0

上一篇:AjaxPage

下一篇:关于TP的路径

给主人留下些什么吧!~~