注入请求对象
在 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']);
上面这两个写法获取的结果是一样的: