目录搜索
基础安装ThinkPHP5.1开发规范目录结构配置基础架构路由控制器请求架构总览入口文件URL访问模块设计命名空间容器和依赖注入Facade钩子和行为路由定义变量规则路由地址闭包支持路由参数跨域请求注解路由路由分组MISS路由资源路由快捷路由路由别名路由绑定域名路由URL生成控制器定义前置操作跳转和重定向空操作和空控制器分层控制器资源控制器请求对象输入变量请求类型HTTP头信息伪静态参数绑定请求缓存响应响应输出响应参数重定向数据库模型视图连接数据库查询数据添加数据更新数据删除数据查询表达式链式操作wheretablealiasfieldstrictlimitpageordergrouphavingjoinuniondistinctlockcachecommentfetchSqlforcepartitionfailExceptionsequence聚合查询时间查询高级查询视图查询JSON字段子查询原生查询查询事件事务操作监听SQL存储过程数据集分布式数据库定义新增更新删除查询JSON数据字段获取器修改器自动时间戳只读字段软删除类型转换数据完成查询范围模型输出事件关联一对一关联一对多关联远程一对多多对多关联多态关联关联预载入关联统计关联输出视图渲染视图赋值视图过滤模板引擎模板变量输出使用函数运算符原样输出模板注释模板布局模板继承包含文件输出替换标签库内置标签循环标签比较标签条件判断资源文件加载标签嵌套原生PHP定义标签错误和日志异常处理日志处理调试验证杂项命令行扩展库安全和性能附录调试模式性能调试SQL调试变量调试远程调试验证器验证规则错误信息验证场景路由验证内置规则独立验证静态调用表单令牌缓存SessionCookie多语言分页上传自动生成目录结构创建类库文件生成类库映射文件清除缓存文件生成配置缓存文件生成数据表字段缓存生成路由映射缓存自定义指令验证码图像处理Time数据库迁移工具WorkermanMongoDb单元测试安全建议优化建议助手函数升级指导更新日志
文字

路由参数

路由分组及规则定义支持指定路由参数,这些参数主要完成路由匹配检测以及行为执行。5.1版本极大改进了路由参数的用法。

路由参数可以在定义路由规则的时候直接传入(批量),不过5.1采用了更加面向对象的方式进行路由参数配置,因此使用方法配置更加清晰。

3~$T)A[59D{X(@I3Q]_J(LG.png

ext和deny_ext参数允许设置为空,分别表示不允许任何后缀以及必须使用后缀访问。

用法举例:

Route::get('new/:id','News/read',['ext'=>'html','https'=>true]);

和使用方法设置(新版推荐的设置方式)等效

Route::get('new/:id', 'News/read')
    ->ext('html')
    ->https();

显然第二种方式更加直观,而且便于IDE的自动提示。

这些路由参数可以混合使用,只要有任何一条参数检查不通过,当前路由就不会生效,继续检测后面的路由规则。

URL后缀

// 定义GET请求路由规则 并设置URL后缀为html的时候有效
Route::get('new/:id', 'News/read')
    ->ext('html');

支持匹配多个后缀,例如:

Route::get('new/:id', 'News/read')
    ->ext('shtml|html');

如果ext方法不传入任何值,表示不允许使用任何后缀访问。

可以设置禁止访问的URL后缀,例如:

// 定义GET请求路由规则 并设置禁止URL后缀为png、jpg和gif的访问
Route::get('new/:id', 'News/read')    
    ->denyExt('jpg|png|gif');

如果denyExt方法不传入任何值,表示必须使用后缀访问。

域名检测

支持使用完整域名或者子域名进行检测,例如:

// 完整域名检测 只在news.thinkphp.cn访问时路由有效
Route::get('new/:id', 'News/read')
    ->domain('news.thinkphp.cn');
// 子域名检测
Route::get('new/:id', 'News/read')
    ->domain('news');

如果需要给子域名定义批量的路由规则,建议使用domain方法进行路由定义。

HTTPS检测

支持检测当前是否HTTPS访问

// 必须使用HTTPS访问
Route::get('new/:id', 'News/read')
    ->https();
    
// 必须使用HTTP访问    
Route::get('new/:id', 'News/read')
    ->https(false);

前置行为检测

支持使用行为对路由进行检测是否匹配,如果行为方法返回false表示当前路由规则无效。

Route::get('user/:id', 'index/User/read')
    ->before(['\app\index\behavior\UserCheck']);

行为类定义如下:

<?php
namespace app\index\behavior;

class UserCheck
{
    public function run()
    {
        if ('user/0' == request()->url()) {
            return false;
        }
    }
}

可以同时使用多个行为进行检测,并且支持使用闭包。

因为前置行为的特殊性,在路由参数的有效性检查后,无论是否最终匹配该路由,都会进行前置行为检查(路由分组的话 会在匹配改分组后 再检查)。

后置行为执行

可以为某个路由或者某个分组路由定义后置行为执行,表示当路由匹配成功后,执行的行为,例如:

Route::get('user/:id', 'User/read')
    ->after(['\app\index\behavior\ReadInfo']);

其中ReadInfo行为类定义如下:

<?php

namespace app\index\behavior;

use app\index\model\User;

class ReadInfo
{
    public function run()
    {
        $id             = request()->route('id');
        app()->user = User::get($id);
    }
}

如果成功匹配到new/:id路由后,就会执行行为类的run方法,参数是路由地址,可以动态改变。同样,后置行为也支持传入闭包。

合并额外参数

通常用于完整匹配的情况,如果有额外的参数则合并作为变量值,例如:

Route::get('new/:name$', 'News/read')
    ->mergeExtraVars();
http://serverName/new/thinkphp/hello

会被匹配到,并且name变量的值为 thinkphp/hello。

路由绑定模型

路由规则和分组支持绑定模型数据,例如:

Route::get('hello/:id', 'index/index/hello')
    ->model('id', '\app\index\model\User');

会自动给当前路由绑定 id为 当前路由变量值的User模型数据。

默认情况下,如果没有查询到模型数据,则会抛出异常,如果不希望抛出异常,可以使用

Route::rule('hello/:id', 'index/index/hello')
    ->model('id', '\app\index\model\User', false);

可以定义模型数据的查询条件,例如:

Route::rule('hello/:name/:id', 'index/index/hello')
    ->model('id&name', '\app\index\model\User');

表示查询id和name的值等于当前路由变量的模型数据。

也可以使用闭包来自定义返回需要的模型对象

Route::rule('hello/:id', 'index/index/hello')
    ->model(function ($param) {
        $model = new \app\index\model\User;
        return $model->where($param)->find();
    });

闭包函数的参数就是当前请求的URL变量信息。

绑定的模型可以直接在控制器的架构方法或者操作方法中自动注入,具体可以参考请求章节的依赖注入。

缓存路由请求

可以对当前的路由请求进行缓存处理,例如:

Route::get('new/:name$', 'News/read')
    ->cache(3600);

表示对当前路由请求缓存3600秒,更多内容可以参考请求缓存一节。

设置Header信息

Route::get('new/:name$', 'News/read')
    ->header('Access-Control-Allow-Origin','*');

header方法支持多次调用。

或者使用数组方式批量设置

Route::get('new/:name$', 'News/read')
    ->header([
    	'Access-Control-Allow-Origin'=>'*',
        'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, DELETE',
    ]);

当路由匹配后,会自动设置本次请求的Response响应对象的Header信息。

响应输出设置

可以调用response方法给路由或者分组绑定响应输出参数,例如:

Route::get('hello/:id', 'index/index/hello')->response([
    '\app\index\behavior\Json',
]);

行为类定义如下:

namespace app\index\behavior;

class Json 
{
    public function run($response)
    {
    	// 调用Response类的方法进行设置
    	$response->contentType('application/json');
    }
}

如果不希望使用行为,可以直接使用闭包

Route::get('hello/:id', 'index/index/hello')->response(function($response){
    	$response->contentType('application/json');
});

如果要给某个路由返回单独的响应对象,也可以使用

Route::get('hello/:id', function () {
    return json('hello,world!');
});

全局路由参数

可以直接进行全局的路由参数设置,例如在路由定义文件中使用

Route::option('ext','html')->option('cache', 600);

表示全局路由都使用html后缀以及600秒的请求缓存。

动态参数

如果你需要额外自定义一些路由参数,可以使用下面的方式:

Route::get('new/:name$', 'News/read')
    ->option('rule','admin');

或者使用动态方法

Route::get('new/:name$', 'News/read')
    ->rule('admin');

在后续的路由行为后可以调用该路由的rule参数来进行权限检查。


上一篇:下一篇: