请求对象

Laravel 的 Illuminate\Http\Request 类提供了一种面向对象的方法,可以与应用程序处理的当前 HTTP 请求进行交互,以及检索与请求一起提交的输入内容,cookies 和文件

访问请求

要通过依赖注入获得当前 HTTP 请求的实例,您应该在路由闭包或控制器方法上导入 Illuminate\Http\Request 类。传入的请求实例将由 Laravel 服务容器 自动注入

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * 存储一个新用户
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $name = $request->input('name');

        //
    }
}

依赖注入和路由参数

如果控制器方法也需要路由的参数传入,则应在其引入的依赖后面列出路由参数。路由应该定义如下

use App\Http\Controllers\UserController;

Route::put('/user/{id}', [UserController::class, 'update']);

您应该注入 Illuminate\Http\Request, 并通过如下定义控制器方法,来访问 id 路由参数

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * 更新指定的用户。
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  string  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}

检索请求路径

path 方法返回请求的路径信息。因此,如果传入请求的目标是 http://example.com/foo/bar,则 path 方法将返回 foo/bar

$uri = $request->path();

检索请求 URL

要检索传入请求的完整 URL,可以使用 urlfullUrl 方法。url 方法将返回不包含查询字符串的 URL,而 fullUrl 方法包含查询字符串

$url = $request->url();

$urlWithQueryString = $request->fullUrl();

检索请求方法

method 方法将返回请求的 HTTP 动词。你可以使用 isMethod 方法来验证 HTTP 动词是否匹配给定的字符串

$method = $request->method();

if ($request->isMethod('post')) {
    //
}

输入

可以使用 all 方法以 array 的形式检索所有传入请求的输入数据。无论传入的请求是来自 HTML 表单还是 XHR 请求,都可以使用此方法

$input = $request->all();

检索一个输入值

使用一些简单的方法,可以从 Illuminate\Http\Request 实例获取所有的用户输入数据,而不用在意用户使用的是哪种 HTTP请求。不管是什么 HTTP 请求, input 方法都可以用来获取用户的输入数据

$name = $request->input('name');

可以将默认值作为第二个参数传递给 `input`` 方法。 如果请求中不存在第一个参数指定的字段的输入值,则将返回此值

$name = $request->input('name', 'Sally');

当使用包含数组输入的表单时,请使用「.」符号来访问数组

$name = $request->input('products.0.name');

$names = $request->input('products.*.name');

可以不带任何参数地调用 input 方法,以便将所有输入值作为关联数组进行检索

$input = $request->input();

从查询字符串中检索输入

input 方法从整个请求有效负载(包括查询字符串)中检索值时,query 方法将仅从查询字符串中检索值

$name = $request->query('name');

如果请求的查询字符串的值不存在,则将返回此方法的第二个参数

$name = $request->query('name', 'Helen');

你可以不带任何参数地调用 query 方法,以将所有查询字符串值作为关联数组来检索

$query = $request->query();

检索 JSON 输入值

向应用程序发送 JSON 请求时,只要将请求的 Content-Type 标头正确设置为 application/json,就可以通过 input 方法访问 JSON 数据。甚至可以使用 “点” 语法来检索嵌套在 JSON 数组中的值

$name = $request->input('user.name');

检索布尔输入值

当处理诸如复选框之类的 HTML 元素时,可能会收到实际上是字符串的 “真实” 值。例如,trueon。为了方便起见,你可以使用 boolean 方法将这些值作为布尔值检索

// 为 1,1,true,true,on 和 yes 返回 true。所有其他值将返回 false
$archived = $request->boolean('archived');

通过动态属性检索输入

还可以使用 Illuminate\Http\Request 实例上的动态属性访问用户输入。例如,如果用户输入的数据包含一个 name 字段,那么可以像下面这样访问该字段的值

// 使用动态属性时,Laravel 将首先在请求有效负载中查找参数的值。如果不存在,Laravel 将在匹配的路线参数中搜索该字段
$name = $request->name;

检索输入数据的一部分

如果需要检索输入数据的子集,则可以使用 onlyexcept 方法。这两种方法都接受单个 数组 或动态参数列表

// 只接收username,password
$input = $request->only(['username', 'password']);

$input = $request->only('username', 'password');

// 除了credit_card字段不接收
$input = $request->except(['credit_card']);

$input = $request->except('credit_card');

注意:only 方法返回你请求的所有键 / 值对;但是,它不会返回请求中不存在的键 / 值对。

判断输入值是否存在

你可以使用 has 来判断当前请求中是否含有指定的值。如果请求中存在该值则 has 方法将会返回 true

if ($request->has('name')) {
    //
}

当给定一个数组时,has 将会判断指定的值是否全部存在

if ($request->has(['name', 'email'])) {
    //
}

如果你想要判断一个值在请求中是否存在,并且不为空,可以使用 filled 方法

if ($request->filled('name')) {
    //
}

Laravel 框架创建的所有 cookie 均已加密并使用身份验证代码签名,这意味着如果客户端更改了它们,它们将被视为无效。若要从请求中检索 cookie 值,请在 Illuminate\Http\Request 实例上使用 cookie 方法

$value = $request->cookie('name');

或者,您可以使用 Cookie Facade 来访问 cookie 的值

$value = Cookie::get('name');

文件

获取上传的文件

您可以使用 file 方法或使用动态属性从 Illuminate\Http\Request 实例中访问上传的文件。 该 file 方法返回 Illuminate\Http\UploadedFile 的实例,该类继承了 PHP 的 SplFileInfo 类的同时也提供了各种与文件交互的方法

$file = $request->file('photo');

$file = $request->photo;

你可以使用 hasFile 方法确认请求中是否存在文件

if ($request->hasFile('photo')) {
    //
}

除了检查上传的文件是否存在外,你也可以通过 isValid 方法验证上传的文件是否有效

if ($request->file('photo')->isValid()) {
    //
}

要存储上传的文件,通常会使用已配置的 文件系统。你可以使用 UploadedFile 的 store 方法把上传文件移动到你的某个磁盘上,该文件可能是本地文件系统中的一个位置,甚至像 Amazon S3 这样的云存储位置。

store 方法接受相对于文件系统配置的根目录应存储文件的路径。 该路径不能包含文件名,因为将自动生成一个唯一的 ID 作为文件名。

store 方法还接受一个可选的第二个参数作为应用于存储文件的磁盘的名称。 该方法将返回文件相对于磁盘根目录的路径

$path = $request->photo->store('images');

$path = $request->photo->store('images', 's3');
powered by GitbookEdit Time: 2023-04-08 10:28:32