Bootstrap

ThinkPHP 8请求处理-获取请求对象与请求上下文

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客

《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书

使用Composer初始化ThinkPHP 8应用_thinkphp8 composer.json-CSDN博客

编程与应用开发_夏天又到了的博客-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
}

 

;