通过 Request 对象实例获取用户请求数据

注入请求对象

在 Laravel 中,访问用户输入数据最常用的方式,就是通过注入到控制器方法中的 Illuminate\Http\Request 对象实例,通过该实例,我们可以访问所有用户请求数据,不管是什么方式,什么格式:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class RequestController extends Controller
{
    public function form(Request $request)
    {
        // 通过 $request 实例获取请求数据
    }
}

然后在路由文件中定义一个指向该控制器方法的路由:

Route::post('form', 'RequestController@form');

注:除此之外,Laravel 还提供了 Request 门面和全局辅助函数 request(),本质都是调用 Illuminate\Http\Request 对象实例,只不过形式不一样而已,所以我一般就是用 Request 对象实例。

接下来,我们就可以在控制器方法中通过 $request 对象实例获取用户请求了,Request 类提供了多种方法来访问用户请求数据。

获取用户请求数据

获取所有请求数据

我们可以通过 $request->all() 获取所有请求数据:

public function form(Request $request)
{
    // 通过 $request 实例获取请求数据
    dd($request->all());
}

为了测试这段代码,我们可以在 Postman 中模拟请求数据,不过在测试前需要在 app/Http/Middleware/VerifyCsrfToken.php 中间件中将测试路由排除在外,否则会因为 POST 请求触发 CSRF 攻击防护验证而导致请求失败:

protected $except = [
    '/form*'
];

然后我们在 Postman 中模拟发起对 /form 路由的请求,同时在 URL 和请求表单中传入请求数据:

可见,不管是 URL 路径中的 GET 请求数据,还是表单中的 POST 请求数据,$request->all() 都可以获取到。

如果只想获取部分请求数据,可以通过 $request 实例上的 except 或 only 方法,这两个方法是相反的,一个用于排除指定字段,一个用于获取指定字段:

只获取部分请求数据

$request->except('id');
$request->only(['name', 'site', 'domain']);

上面这两个写法获取的结果是一样的:

Request的使用