[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