请求

未匹配的标注

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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
贡献者:4
讨论数量: 0
发起讨论 只看当前版本


暂无话题~