注入的一个 Illuminate\Http\Request 实例, 是 laravel 中最常用的收集和处理用户数据的工具.

tip: 你也可以使用 request() 全局帮助函数 and Request facade, 他们都会暴露一个 Illuminate Request 对象.

  1. Route::post('form', function (Illuminate\Http\Request $request) {
  2. // $request->etc()
  3. });

表单数据

  • $request->All() : 获取所有参数(包括post 和 get)
  • $request->except()$request->only() : 排除和只添加
  • $request->has() : 检查是否有参数
  • $request->input('name', 'defaultValue') : 获取一个值
  • $request->method() : 返回 http 动词
  • $request->isMethod('post') : 检查是否是 post
  • array input
<!-- GET route form view at /employees/create -->
<form method="post" action="/employees/">
    @csrf
    <input type="text" name="employees[0][firstName]">
    <input type="text" name="employees[0][lastName]">
    <input type="text" name="employees[1][firstName]">
    <input type="text" name="employees[1][lastName]">
    <input type="submit">
</form>
// POST route at /employees
Route::post('employees', function (Request $request) {
    $employeeZeroFirstName = $request->input('employees.0.firstName');
    $allLastNames = $request->input('employees.*.lastName');
    $employeeOne = $request->input('employees.1');
    var_dump($employeeZeroFirstname, $allLastNames, $employeeOne);
});
  • json input$raquest->json()
POST /post-route HTTP/1.1
Content-Type: application/json
{
    "firstName": "Joe",
    "lastName": "Schmoe",
    "spouse": {
        "firstName": "Jill",
        "lastName":"Schmoe"
        }
}

// input() 也可以处理 json 数据
Route::post('post-route', function (Request $request) {
    $firstName = $request->input('firstName');
    $spouseFirstname = $request->input('spouse.firstName');
});

// 但是如果正确设置 application/json 请求头的 post 数据, input()就处理不了, 这时候需要 json()
  • 顺便说一句
// 以下都是等价的
request()->has(); // 全局函数形式 
Illuminate\Support\Facades\Request::has(); // Facade 形式 
$request->has(); // 注入实例形式

// 以下也等价
request('firstName');
request()->input('firstName')

url 参数

例如 “http://www.myapp.com/users/15/“ 有两个参数: users15.

  • $request->segments() : 获取所有参数 并返回一个数组
  • $request->segment($segmentId) : 获取一个参数 $segmentId 是参数序号, 从1开始的( 即 $request->segment(1) 获取 ‘users’)
  • 路由参数直接会注入到控制器或闭包函数中 如下:
Route::get('users/{id}', function ($id) {
    // If the user visits myapp.com/users/15/, $id will equal 15
});

上传文件

laravel 使用 $request->file($fileInputName) 方法接受上传的文件, 接受上传文件的输入框的名字作为参数, 返回一个 Symfony\Component\HttpFoundation\File\UploadedFile 实例.

<form method="post" enctype="multipart/form-data">
    @csrf
    <input type="text" name="name">
    <input type="file" name="profile_picture">
    <input type="submit">
</form>

$request->input('profile_picture') 将会返回 null ; 我们需要使用 $request->file('profile_picture')替代

Route::post('form', function (Request $request) {
    var_dump($request->all());
});

// Output:
// [
// "_token" => "token here",
// "name" => "asdf",
// "profile_picture" => UploadedFile {},
// ]

Route::post('form', function (Request $request) {
    if ($request->hasFile('profile_picture')) {
        var_dump($request->file('profile_picture'));
    }
});

// Output:
// UploadedFile (details)

校验上传

if ($request->hasFile('profile_picture') && $request->file('profile_picture')->isValid()) {
    //
}
  • guessExtension()
  • getMimeType()
  • store($path, $storageDisk = default disk)
  • storeAs($path, $newName, $storageDisk = default disk)
  • storePublicly($path, $storageDisk = default disk)
  • storePubliclyAs($path, $newName, $storageDisk = default disk)
  • move($directory, $newName = null)
  • getClientOriginalName()
  • getClientOriginalExtension()
  • getClientMimeType()
  • guessClientExtension()
  • getClientSize()
  • getError()
  • isValid()

常见流程

if ($request->hasFile('profile_picture')) {
    // 自定义名字
    // $path = $request->profile_picture->storeAs('profiles', 'newName',  's3');
    $path = $request->profile_picture->store('profiles', 's3');
    auth()->user()->profile_picture = $path;
    auth()->user()->save();
}