【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客
使用Composer初始化ThinkPHP 8应用_thinkphp8 composer.json-CSDN博客
ThinkPHP 8提供了Request对象用于封装HTTP请求。下面我们一起来学习如何在ThinkPHP 8中进行请求处理,比如获取请求参数、校验请求参数等。
6.2.1 获取请求对象
Request对象由ThinkPHP 框架实例化,开发者需要手动实例化Request对象。ThinkPHP 框架提供了4种方法来获取Request对象,读者可以根据自己的项目要求或者个人习惯,固定使用一种获取方式,并保持一致性以提高开发效率。
1. 继承BaseController
前面的内容提到过,BaseController提供了Request实例和App实例,因此可以直接继承BaseController,再通过$this->request获取请求实例。
2. 调用助手函数
笔者常用的方法是,在ThinkPHP 框架底层通过依赖注入容器对请求对象进行单例处理,只有第一次调用request()函数会自动创建请求对象,以避免多次调用产生的开销问题。
笔者推荐使用该方法获取请求对象,具体用法参看下面示例。
【示例6-6】
<?php
// 控制器
namespace app\controller;
use app\BaseController;
class Index extends BaseController
{
public function index()
{
$url = request()->url();
return $url;
}
}
启动服务器后,在浏览器中访问http://localhost:8000,查看输出结果。
3. 构造方法注入
在未继承BaseController的情况下,我们可以定义一个Request属性和对应的构造方法,框架会自动通过依赖注入构造请求对象。具体示例如下。
【示例6-7】
新建app/controller/Index.php文件,代码如下:
<?php
// 控制器
namespace app\controller;
use app\Request;
class Index
{
protected Request $request;
/**
* @param Request $request
*/
public function __construct(Request $request)
{
$this->request = $request;
}
public function index()
{
return $this->request->url();
}
}
启动服务器后,在浏览器中访问http://localhost:8000,查看输出结果。从示例代码可以发现,通过构造方法注入请求对象代码量有点多,因此一般不建议使用该方法。
4. 静态方法调用
某些场景下未使用依赖注入,可以通过Request门面来获取Request对象。具体示例如下。
【示例6-8】
新建app/controller/Index.php文件,代码如下:
<?php
// 控制器
namespace app\controller;
use think\facade\Request;
class Index
{
public function index()
{
return Request::url();
}
}
启动服务器后,在浏览器中访问http://localhost:8000,查看输出结果。
5. 操作方法注入
构造方法的注入需要给控制器定义相关的属性。而操作方法的注入,只需要直接调用参数即可,不需要给控制器定义额外的属性;其缺点是只能在这个操作方法内部调用。具体示例如下。
【示例6-9】
新建app/controller/Index.php文件,代码如下:
<?php
// 控制器
namespace app\controller;
use think\Request;
class Index
{
public function index(Request $request)
{
return $request->url();
}
}
启动服务器后,在浏览器中访问http://localhost:8000,查看输出结果。
6.2.2 获取请求上下文信息
请求上下文信息可以理解为本次请求的元数据,比如请求方法、访问路径等。想了解更多信息,可以前往ThinkPHP官方网站自行查询。
【示例6-10】
新建app/controller/Index.php文件,代码如下:
<?php
// 控制器
namespace app\controller;
use think\Request;
class Index
{
public function index()
{
return json([
'url' => request()->url(),
'controller' => request()->controller(),
'action' => request()->action(),
'host' => request()->host()
]);
}
}
输出结果如下:
{
"url": "/",
"controller": "Index",
"action": "index",
"host": "0.0.0.0:8000"
}
可以使用Request对象的method方法以及对应的is函数来判断当前请求方法。比如,登录接口只允许POST请求,那么就可以通过request()->isPost()方法来判断是否使用了POST请求方法。
【示例6-11】
新建app/controller/Index.php文件,代码如下:
<?php
// 控制器
namespace app\controller;
use think\Request;
class Index
{
public function index()
{
return json([
'method' => request()->method(),
'is_get' => request()->isGet(),
'is_post' => request()->isPost()
]);
}
}
直接使用浏览器访问http://localhost:8000/,输出结果如下:
{
"method": "GET",
"is_get": true,
"is_post": false
}