HTTP Requests

未匹配的标注
本文档最新版为 6.x,旧版本可能放弃维护,推荐阅读最新版!

HTTP 请求

获取请求

可以通过依赖注入的方式来获取当前 HTTP 请求实例,你应该在控制器构造函数或方法中类型提示 Illuminate\Http\Request 类,当前请求实例将由 服务容器 自动注入:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

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

        //
    }
}

如果你的控制器方法也期望从路由参数中获取数据,只需在其他依赖之后列出路由参数。例如,你的路由是这样定义的:

$router->put('user/{id}', 'UserController@update');

你仍然可以使用 Illuminate\Http\Request 类型提示,并通过定义你的控制器方法来获取路由参数 id 如下所示:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

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

基本请求信息

Illuminate\Http\Request 实例继承了 Symfony\Component\HttpFoundation\Request 类,并提供了多种方法来检查应用程序的 HTTP 请求,下面是该类的几个实用方法:

获取请求路径

path 方法返回请求的路径信息。如果请求的目标地址是 http://domain.com/foo/bar, path 方法将会返回 foo/bar:

$uri = $request->path();

is 方法可以验证收到请求 URL 与指定规则是否匹配。使用该方法时可以使用 * 符号作为通配符:

if ($request->is('admin/*')) {
    //
}

使用 url 方法,可以获取完整的网址,fullUrl 方法可以获取到带 get 请求参数的完整网网址:

// 不包含请求字符串
$url = $request->url();

// 包含请求字符串
$url = $request->fullUrl();

获取请求方法

method 方法将返回此次 HTTP 请求的动作。也可以通过 isMethod 方法验证 HTTP 动作与指定字符串是否匹配:

$method = $request->method();

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

PSR-7 请求

PSR-7 标准制定的 HTTP 消息接口包含了请求和响应。如果你想获取一个 PSR-7 请求实例,首先你需要安装几个函数库。 Laravel 使用 Symfony 的 HTTP 消息桥接组件,将原 Laravel 的请求及响应转换成 PSR-7 所支持的实现:

composer require symfony/psr-http-message-bridge

composer require zendframework/zend-diactoros

一旦安装了这些函数库,可以在路由或者控制器中,简单地对请求使用类型提示获取 PSR-7 请求:

use Psr\Http\Message\ServerRequestInterface;

$router->get('/', function (ServerRequestInterface $request) {
    //
});

如果从路由或者控制器返回一个 PSR-7 响应,那么它会被框架自动转换成 Laravel 响应实例并显示。

获取输入数据

获取特定输入

你可以通过 Illuminate\Http\Request 实例,借助几个简单的方法获取所有用户输入的数据。不需要关注发出请求时使用的 HTTP 动作:

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

你可以在 input 方法中的第二个参数传入一个默认值。当请求的数据不存在于此次请求中,就会返回默认值:

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

当获取的数据是数组形式时,可以通过「 点 」语法进行获取数组中的数据:

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

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

确定输入数据是否存在

使用 has 方法判断当前请求中的值是否存在。当请求中的值存在时 has 方法将返回 true

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

当给定一个数组作为 has 参数时,has 方法将判断数组中所有指定的值是:

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

如果你想判断当前请求中值是否存在且不为空,可以使用 filled 方法:

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

获取所有输入数据

你可以使用 all 方法以 array 形式获取所有输入数据:

$input = $request->all();

获取部分输入数据

如果你需要获取数据的子集,可以使用 onlyexcept 方法。这两个方法都接受单个 array 或者动态列表作为参数:

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

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

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

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

文件上传

获取上传文件

你可以使用 Illuminate\Http\Request 实例的 file 方法获取上传文件。file 方法返回的对象是Symfony\Component\HttpFoundation\File\UploadedFile 类的实例,这个类继承了 PHP 的 SplFileInfo 类,并且提供了多种与文件交互的方法:

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

你可以使用 hasFile 方法确认上传的文件是否存在:

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

验证上传是否成功

除了检查文件是否存在之外,你也可以通过 isValid 方法验证上传文件是否存在问题:

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

移动上传文件

如果要将上传的文件移动到新的位置,你应该使用 move 方法。这个方法将会把文件从临时目录移动到你决定的永久保存的位置(由你的配置文件所决定)

$request->file('photo')->move($destinationPath);

$request->file('photo')->move($destinationPath, $fileName);

其他上传文件方法

UploadedFile 实例还有很多其他方法。可以到 该类API文档 了解这些方法的详细信息。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/lumen/5.5/http-...

译文地址:https://learnku.com/docs/lumen/5.5/http-...

上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
贡献者:3
讨论数量: 0
发起讨论 只看当前版本


暂无话题~