# HTTP Requests
- [获取请求实例](#accessing-the-request)
- [基本请求信息](#basic-request-information)
- [PSR-7 请求](#psr7-requests)
- [获取输入数据](#retrieving-input)
- [文件上传](#files)
## 获取请求实例
要通过依赖注入的方式获取当前HTTP请求的实例,你应该在控制器构造函数或方法中使用 `Illuminate \ Http \ Request` 类,当前请求实例将自动被 [服务容器](/docs/{{version}}/container) 注入:
input('name');
//
}
}
如果你的控制器方法也期望从路由参数中获取数据,只需要将路由参数放在其他依赖后面,比如你的路由是这样定义的:
$router->put('user/{id}', 'UserController@update');
像下面这样定义你的控制器方法,就可以使用 `Illuminate\Http\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` 方法:
// 不包含请求参数
$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();
#### 获取部分输入数据
如果你想获取数据的子集, 你可以使用 `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` 方法获取上传的文件, `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 文档](http://api.symfony.com/3.0/Symfony/Component/HttpFoundation/File/UploadedFile.html) 了解这些方法的详细信息。