请求

HTTP请求

获取请求实例

要是通过依赖注入的方式去获取当前 HTTP 请求的实例,你应该在控制器构造函数或方法中去使用 Illuminate\Http\Request 类,当前的请求实例将自动被服务容器 注入:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Store a new user.
     *
     * @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
{
    /**
     * Update the specified user.
     *
     * @param  Request  $request
     * @param  string  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}

基本请求信息

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

获取请求的 URI

这个 path 方法会返回请求的 URI. 因此, 如果你请求的目标地址是http://domain.com/foo/bar, 这个 path 方法将会返回 foo/bar:

$uri = $request->path();

这个 is方法可以校验接收到的请求 URI 是否与指定规则匹配. 当你使用此方法是,你可以使用* 作为通配符:

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

想要获取完整的 URL 而不是 URI,你可以使用请求实例上的 url 或者fullUrl 方法:

// Without Query String...
$url = $request->url();

// With Query String...
$url = $request->fullUrl();

获取请求的方法

method 方法将会返回请求的 HTTP 动作. 你可以使用 isMethod 方法去校验 HTTP 动作是否与指定字符串匹配:

$method = $request->method();

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

PSR-7 请求

PSR-7标准为HTTP消息指定了接口,包括请求和响应。获取 PSR-7 请求实例,必须先安装一些库。Laravel 使用 Symfony HTTP Message Bridge 组件将典型的 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 方法来确定是否存在输入值,如果存在,将返回 true

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

当传入的是数组时,has 方法将确定接收的值是否全部都存在:

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

如果你想确定一个值存在并且不为空,可以使用 filled 方法:

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

获取全部输入值

你可以使用 all 方法来检索全部的输入数据,结果是一个数组:

$input = $request->all();

获取部分输入数据

如果你只需要检索部分输入数据,可以使用 onlyexcept 方法。这两个方法都可以接收一个数组或动态参数列表:

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

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

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

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

文件

获取文件上传

你可以使用 Illuminate\Http\Request 实例提供的 file 方法来获取上传的文件。files 方法返回的是 Symfony\Component\HttpFoundation\File\UploadedFile 类的实例对象,该类继承于 PHP SplFileInfo 类并提供了一系列的文件操作的方法:

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

hasFile 方法用来确定上传文件是否存在:

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

验证成功上传

除了验证文件是否存在,你也可以通过 isValid 方法来验证文件上传是否成功:

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

存储上传文件

使用 move 方法,可以将上传文件存储到指定位置。此方法会将文件从临时上传位置(由您的PHP配置确定)移动到您选择存储的目标位置:

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

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

其他文件操作方法:

UploadedFile 实例提供了更多的文件操作方法,点击 API documentation for the class 获取更多信息。

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

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
贡献者:3
讨论数量: 0
发起讨论 只看当前版本


暂无话题~