当前位置:  首页>> 技术小册>> ThinkPHP项目开发实战

ThinkPHP 5采用的默认规则是PATHINFO模式,也就是如下的URL形式:

  1. http://server/module/controller/action/param/value/

与ThinkPHP 3最大的不同是ThinkPHP 5的路由更加灵活,支持路由到模块的控制器/操作、控制器类的方法、闭包函数和重定向地址,甚至是任何类库的方法。

需要注意的是,ThinkPHP 5的路由是针对应用而不是模块,所以路由是针对某个应用下的所有模块。如果需要按照模块定义路由,就需要自定义如下入口文件:

路由模式

ThinkPHP 5的路由通过url_route_on和url_route_must来控制路由行为。根据这两个配置,存在三种路由模式:普通模式、混合模式和强制模式。

普通模式

禁用路由,系统按照PATHINFO模式解析请求:
'url_route_on' => false,

混合模式

系统按照PATHINFO模式+路由定义解析请求:

  1. 'url_route_on' => true,
  2. 'url_route_must'=> false,

若定义了路由,则执行路由,否则按照PATHINFO解析。

强制模式

该模式下所有请求必须设置路由,否则抛出异常:

  1. 'url_route_on' => true,
  2. 'url_route_must' => true,

路由定义

编码定义

顾名思义,就是使用硬编码的形式进行定义(区别于配置式定义)。一般路由定义在application/route.php文件中,注册形式如下:

  1. Route::rule('路由表达式','路由地址','请求方法','路由条件','变量规则');

例如,下面的注册代码将会使访问“/news/”新闻ID的链接路由到index模块的News控制器的read方法:

  1. Route::rule('news/:id','index/News/read');

由于ThinkPHP 5的路由是针对所有模块的,所以定义的时候需要加上模块名。

ThinkPHP 5支持GET、POST、PUT、DELETE以及任意(*)请求方法定义。系统内置以下方法来简化路由定义:

  1. Route::get('news/:id','News/read'); // GET
  2. Route::post('news/:id','News/update'); // POST
  3. Route::put('news/:id','News/update'); // PUT
  4. Route::delete('news/:id','News/delete'); // DELETE
  5. Route::any('new/:id','News/read'); //任意请求方法

如果一个路由可以同时支持多种请求方法,可以使用“|”符号,意思和“或”一致。例如,有如下定义:

  1. Route::rule('news/:id','index/News/read', 'GET|POST');

则该路由允许POST和GET请求方法访问。

配置定义

通过返回数组来定义路由,而且可以批量定义,简化代码编写量。该定义方式和ThinkPHP 3很相似,但是不支持正则定义。例如:

  1. <?php
  2. return [
  3. // 首页路由到index模块index控制器的index方法
  4. '/' => 'index/index/index',
  5. 'news/:id' => 'index/News/read', // 变量定义
  6. 'news/[:id]' => 'index/news/read', // 可选变量定义
  7. 'news/:id$' => 'index/news/read', // 完全匹配
  8. 'user/:id' => 'index/user/show?status=1', // 传递隐式参数
  9. // 限制变量类型
  10. 'post/:id'=> ['index/post/show',['ext'=>'html'],['id'=>'\d{4}']],
  11. ];

该分类下的相关小册推荐: