请求

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 请求的方法,下面是该类的几个实用方法:

获取请求的 URI

path 方法会返回请求的 URI,如果请求的目标是 http://domain.com/foo/barpath 方法将会返回 foo/bar

$uri = $request->path();

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

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

如果要获取完整的 URL 而不是 URI,可以使用 url 或者 fullUrl 方法:

// 不包含请求参数
$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 方法将确定是否所有指定值都存在:

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 方法获取上传的文件, file 方法返回的对象是 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 文档 了解这些方法的详细信息。

本文章首发在 LearnKu.com 网站上。
上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~