Lumen 6 中文文档 请求
获取请求实例
要是通过依赖注入的方式去获取当前 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();
获取部分输入数据
如果你只需要检索部分输入数据,可以使用 only
或 except
方法。这两个方法都可以接收一个数组或动态参数列表:
$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 获取更多信息。