请求对象
6.0的请求Request对象可以更方便的在项目里面自定义,系统默认提供了app\Request类用于项目自定义请求对象。即使你依赖注入的时候使用think\Request或者使用think\facade\Request门面对象,实际都是操作app\Request,不要问为什么,容器就是这么任性。
Request对象是没有任何的配置参数的,所有设置都是通过属性定义,如果你需要改变Request对象的参数,直接在app\Request类中重载属性定义即可,当然也可以直接增加需要的方法。
如果你项目里面的自定义Request类不是app\Request类,记得修改provider.php文件。
需要调用请求对象方法的地方,建议直接使用依赖注入即可。
请求变量
获取当前请求变量最简单的方法是使用param方法(无论是什么请求类型都会自动识别):
// 获取全部请求变量
request()->param();
// 获取部分请求变量
request()->param(['id', 'name']);
// 排除某些变量
request()->except(['content']);
变量过滤
支持对输入变量进行过滤操作,如果是全局的过滤,你可以在app\Request类中定义filter属性。
namespace app;
class Request extends \think\Request
{
protected $filter = ['htmlspecialchars'];
}
如果只需要对部分变量进行过滤,则可以使用
request()->param('username','','strip_tags'); // 获取param变量 并用strip_tags函数过滤
param方法的第二个参数是当变量为空的时候默认值。第三个参数支持传入数组,表示使用多个过滤方法。
助手函数
系统提供了input助手函数用于获取输入变量。
input('username','','strip_tags'); // 获取param变量 并用strip_tags函数过滤
获取当前控制器和操作
由于中间件机制的调整,在全局中间件里面是无法获取当前请求的路由变量(包括当前路由规则)以及框架设置的应用变量(包括控制器和操作名),你必须要改成在路由中间件,但并不是说你必须要在路由注册的时候一个个设置中间件,你可以直接在路由配置文件中添加:
'middleware' => [
app\middleware\Auth::class,
],
这样,所有该应用下的请求都会执行Auth中间件。
在Auth中间件中你就可以和之前一样获取当前的控制器名和操作名了。默认获取的控制器名是驼峰方式,而操作名则是你实际定义的方法名,为了鉴权方便,你可以在获取控制器和操作名的时候传入true会返回一个小写转换后的值。
例如我们定义了一个UserInfo控制器类,并且定义了一个helloWorld操作方法:
namespace app\controller;
class UserInfo
{
public function helloWorld()
{
}
}
当我们访问
http://tp.com/UserInfo/helloworld
获取到的控制器和操作名是
$request->controller(); // UserInfo
$request->controller(true); // userinfo
$request->action(); // helloWorld
$request->action(true); // helloworld
另外一个需要注意的是获取当前应用名的方法必须改成使用
app('http')->getName();
请求缓存
请求缓存仅针对GET请求,并且可以设置排除规则,通过在路由定义的时候设置请求缓存会是一个比较灵活和方便的处理。如果你的页面包括登录信息之类的数据应该考虑使用AJAX方式处理,避免被缓存。
即使你启用了请求缓存,也可以在响应输出的时候取消缓存
$response->allowCache(false);
发表评论