[TOC]
# 请求
## 请求对象
### 依赖注入 & 路由参数
在控制器上引入`Illuminate\Http\Request`类, 传入的请求实例将会由 [服务容器] 自动注入
```
// 路由定义
Route::put('user/{id}', 'UserController@update');
<?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)
{
//
}
}
```
### 通过闭包路由获取参数
```
use Illuminate\Http\Request;
Route::get('/', function (Request $request) {
//
});
```
### 获取请求路径
```
// 若请求路径 http://domain.com/foo/bar, path 方法返回 foo/bar
$uri = $request->path();
// is 可以验证传入的请求路径是否与给定的模式匹配
if ($request->is('admin/*')) {
//
}
```
### 获取请求 URL
```
$url = $request->url(); // 不附带查询串...
$url = $request->fullUrl(); // 附带查询串...
```
### 获取请求 Method
```
// method 方法返回请求的 HTTP 动作
$method = $request->method();
if ($request->isMethod('post')) {
//
}
```
### PSR-7 请求
```
// 用 PSR-7 请求代替 Laravel 请求,需要先安装扩展库
$ composer require symfony/psr-http-message-bridge
$ composer require zendframework/zend-diactoros
// 通过在路由闭包或控制器方法中的请求接口类型提示来获取 PSR-7 请求
use Psr\Http\Message\ServerRequestInterface;
Route::get('/', function (ServerRequestInterface $request) {
//
});
```
>[info] 提示:如果从路由或控制器返回 PSR-7 响应实例,框架会自动将其转换回 Laravel 响应实例并显示。
## 输入的裁剪和标准化
>[success] 应用的全局中间件堆栈中包含了 TrimStrings 和 ConvertEmptyStringsToNull 中间件,用来格式化请求数据,trim()、替换空为 null。不需要可以在 App\Http\Kernel 类的 $middleware 属性删除。
## 请求信息
```
// 获取所有的请求数据
$input = $request->all();
// input 获取所有http方法的请求数据
$name = $request->input('name');
$name = $request->input('name', 'Sally'); // 设置默认值
$name = $request->input('products.0.name'); // 获取数组参数
$names = $request->input('products.*.name'); // 获取数组参数
$input = $request->input(); // 获取所有请求数据的关联数组
// query 从查询串中获取输入数据
$name = $request->query('name');
$name = $request->query('name', 'Helen'); // 设置默认值
$query = $request->query(); // 获取所有查询数据的关联数组
// 通过动态属性获取输入
// 先在请求载体中查找参数的值,如果不存在,则在路由参数中搜索
$name = $request->name;
// 获取 JSON 输入,请求的 Content-Type 头设置为 application/json
$name = $request->input('user.name');
// 获取部分输入数据
$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
$input = $request->except('credit_card');
```
>[info] 提示:`only`方法返回请求中的全部键值对;但是它不返回请求中不存在的键值对。
### 判断输入值是否存在
```
if ($request->has('name')) {
// 判定请求中是否存在指定的值
}
if ($request->has(['name', 'email'])) {
// 判断在请求中,指定的值是否全部存在
}
if ($request->filled('name')) {
// 判断一个值在请求中是否存在,并且不为空
}
```
### 将输入数据传送到 Session
```
// 将输入数据传送到 Session,等待后续操作使用
$request->flash();
$request->flashOnly(['username', 'email']); // 只保留 username、email
$request->flashExcept('password'); // 排除 password
```
### 传送数据至 session 并跳转
```
return redirect('form')->withInput();
return redirect('form')->withInput(
$request->except('password')
);
```
### 获取旧数据
```
$username = $request->old('username');
// Blade模板显示旧数据
<input type="text" name="username" value="{{ old('username') }}">
```
### Cookies
```
// 获取 Cookies
$value = $request->cookie('name');
$value = Cookie::get('name'); // Cookie facade 访问 cookie 值
// 设置 Cookies ,名称、值、过期时间,与`setcookie`方法的参数类似
return response('Hello World')->cookie(
'name', 'value', $minutes [, $path, $domain, $secure, $httpOnly]
);
// Cookie 队列,`queue`方法接受一个`Cookie`实例或者创建实例所需的参数
Cookie::queue(Cookie::make('name', 'value', $minutes));
Cookie::queue('name', 'value', $minutes);
// 生成 Cookie 实例
$cookie = cookie('name', 'value', $minutes);
return response('Hello World')->cookie($cookie);
```
## 文件
```
// 获取上传的文件
$file = $request->file('photo'); // 返回 Illuminate\Http\UploadedFile 实例
$file = $request->photo;
if ($request->hasFile('photo')) {
// 判断请求中是否存在指定文件
}
if ($request->file('photo')->isValid()) {
// 验证文件
}
$path = $request->photo->path(); // 上传文件的路径
$extension = $request->photo->extension(); // 根据文件内容猜测匹配扩展名
// 存储上传文件
// `store`方法接受相对于文件系统配置的存储文件根目录的路径。
// 这个路径不能包含文件名,因为系统会自动生成唯一的 ID 作为文件名。
// `store`方法还接受可选的第二个参数,用于存储文件的磁盘名称。
$path = $request->photo->store('images');
$path = $request->photo->store('images', 's3');
// 自定义文件名称
$path = $request->photo->storeAs('images', 'filename.jpg');
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');
```
## 配置可信代理
如果应用程序运行在失效的 TLS / SSL 证书的负载均衡器后,你可能会注意到应用程序有时不能生成 HTTPS 链接。通常这是因为你的应用程序正在从端口 80 上的负载均衡器转发流量,却不知道是否应该生成安全链接。
解决这个问题需要在 Laravel 应用程序中包含`App\Http\Middleware\TrustProxies`中间件,这使得你可以快速自定义应用程序信任的负载均衡器或代理。你的可信代理应该作为这个中间件的`$proxies`属性的数组列出。除了配置受信任的代理之外,还可以配置应该信任的代理`$header`
```
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
class TrustProxies extends Middleware
{
/**
* 应用程序的可信代理列表
*
* @var array
*/
protected $proxies = [
'192.168.1.1',
'192.168.1.2',
];
/**
* 应该用来检测代理的头信息
*
* @var string
*/
protected $headers = Request::HEADER_X_FORWARDED_ALL;
}
```
**信任所有代理**
```
protected $proxies = '*';
```
- 入门指南
- 安装
- 部署
- 基础功能
- 路由
- 中间件
- CSRF 保护
- 控制器
- 请求
- 响应
- 视图
- URL
- Session
- 表单验证
- 错误
- 日志
- 前端开发
- Blade 模板
- 本地化
- 脚手架
- 编译资源 Mix
- 安全相关
- 用户认证
- API 认证
- 综合话题
- 命令行
- 广播
- 缓存
- 集合
- 事件
- 文件存储
- 辅助函数
- 邮件发送
- 消息通知
- 扩展包开发
- 队列
- 任务调度
- 数据库
- 快速入门
- 查询构造器
- 分页
- 数据库迁移
- 数据填充
- Redis
- Eloquent ORM
- 快速入门
- 速查表
- Artisan
- Auth
- Blade
- Cache
- Collection
- Composer
- Config
- Container
- Cookie
- DB
- Environment
- Event
- File
- Helper
- Input
- Lang
- Log
- Model
- Pagination
- Queue
- Redirect
- Request
- Response
- Route
- SSH
- Schema
- Security
- Session
- Storage
- String
- URL
- UnitTest
- Validation
- View