[TOC]
### **1、訪問[請求](http://laravelacademy.org/tags/%e8%af%b7%e6%b1%82 "View all posts in 請求")實例**
通過依賴注入獲取當前?[HTTP](http://laravelacademy.org/tags/http "View all posts in HTTP")?請求實例,應該在控制器的構造函數或方法中對?`Illuminate\Http\[Request](http://laravelacademy.org/tags/request "View all posts in Request")`?類進行類型提示,當前請求實例會被服務容器自動注入:
~~~
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* 存儲新用戶
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name=$request->input('name');
//
}
}
~~~
如果你的控制器方法還期望獲取路由參數輸入,只需要將路由參數置于其它依賴之后即可,例如,如果你的路由定義如下:
~~~
Route::put('user/{id}','UserController@update');
~~~
你仍然可以對?`Illuminate\Http\Request`?進行類型提示并通過如下方式定義控制器方法來訪問路由參數:
~~~
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
classUser Controller extends Controller
{
/**
* 更新指定用戶
*
* @param Request $request
* @param int $id
* @return Response
*/
public function update(Request $request,$id)
{
//
}
}
~~~
#### **基本請求信息**
`Illuminate\Http\Request`?實例提供了多個方法來檢測應用的 HTTP 請求,[Laravel](http://laravelacademy.org/tags/laravel "View all posts in Laravel")?的?`Illuminate\Http\Request`繼承自 ?`Symfony\Component\HttpFoundation\Request`?類,下面演示了一些該類中的有用方法:
**獲取請求URI**
`path`?方法將會返回請求的 URI,因此,如果進入的請求路徑是?`http://domain.com/foo/bar`,則?`path`?方法將會返回?`foo/bar`:
~~~
$uri=$request->path();
~~~
`is`?方法允許你驗證進入的請求是否與給定模式匹配。使用該方法時可以使用?`*`?通配符:
~~~
if($request->is('admin/*')){
//
}
~~~
想要獲取完整的 URL,而不僅僅是路徑信息,可以使用請求實例中的?`url`?或?`fullUrl`?方法:
~~~
$url=$request->url();
$url = $request->fullUrl();
~~~
**獲取請求方法**
`method`?方法將會返回請求的 HTTP 請求方式。你還可以使用?`isMethod`?方法來驗證 HTTP 請求方式是否匹配給定字符串:
~~~
$method=$request->method();
if($request->isMethod('post')){
//
}
~~~
#### **[PSR-7](http://laravelacademy.org/tags/psr-7 "View all posts in PSR-7")?請求**
[PSR-7 標準](http://www.php-fig.org/psr/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;
Route::get('/', function (ServerRequestInterface $request) {
//
});
~~~
如果從路由或控制器返回的是 PSR-7 響應實例,則其將會自動轉化為 Laravel 響應實例并顯示出來。
### **2、獲取請求輸入**
**獲取輸入值**
使用一些簡單的方法,就可以從?`Illuminate\Http\Request`?實例中訪問用戶輸入。你不需要關心請求所使用的 HTTP 請求方法,因為對所有請求方式的輸入訪問接口都是一致的:
~~~
$name = $request->input('name');
~~~
此外,你也可以通過使用?`Illuminate\Http\Request`?實例上的動態屬性來訪問用戶輸入。例如,如果你的應用表單包含?`name`?字段,那么可以像這樣訪問提交的值:
~~~
$name = $request->name;
~~~
你還可以傳遞一個默認值作為第二個參數給?`input`?方法,如果請求輸入值在當前請求未出現時該值將會被返回:
~~~
$name = $request->input('name', 'Sally');
~~~
處理表單數組輸入時,可以使用”.”來訪問數組輸入:
~~~
$input = $request->input('products.0.name');
$names = $request->input('products.*.name');
~~~
**判斷輸入值是否出現**
判斷值是否在請求中出現,可以使用?`has`?方法,如果值出現過了且不為空,`has`?方法返回?`true`:
~~~
if ($request->has('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');
~~~
#### **上一次請求輸入**
Laravel 允許你在兩次請求之間保存輸入數據,這個特性在檢測校驗數據失敗后需要重新填充表單數據時很有用,但如果你使用的是 Laravel 內置的驗證服務,則不需要手動使用這些方法,因為一些 Laravel 內置的校驗設置會自動調用它們。
**將輸入存儲到一次性?[Session](http://laravelacademy.org/tags/session "View all posts in Session")**
`Illuminate\Http\Request`?實例的?`flash`?方法會將當前輸入存放到一次性 Session(所謂的一次性指的是從 Session 中取出數據中,對應數據會從 Session 中銷毀)中,這樣在下一次請求時數據依然有效:
~~~
$request->flash();
~~~
你還可以使用?`flashOnly`?和?`flashExcept`?方法將輸入數據子集存放到 Session 中:
~~~
$request->flashOnly('username', 'email');
$request->flashExcept('password');
~~~
**將輸入存儲到一次性 Session 然后[重定向](http://laravelacademy.org/tags/%e9%87%8d%e5%ae%9a%e5%90%91 "View all posts in 重定向")**
如果你經常需要一次性存儲輸入并重定向到前一頁,可以簡單使用?`withInput`?方法來將輸入數據鏈接到?`redirect`后面:
~~~
return redirect('form')->withInput();
return redirect('form')->withInput($request->except('password'));
~~~
**取出上次請求數據**
要從 Session 中取出上次請求的輸入數據,可以使用 Request 實例的?`old`?方法。`old`?方法提供了便利的方式從 Session 中取出一次性數據:
~~~
$username = $request->old('username');
~~~
Laravel 還提供了一個全局的輔助函數?`old`,如果你是在 Blade 模板中顯示上次輸入數據,使用輔助函數?`old`?更方便,如果給定參數沒有對應輸入,返回 null:
~~~
{{ old('username') }}
~~~
#### **[Cookie](http://laravelacademy.org/tags/cookie "View all posts in Cookie")s**
**從請求中取出Cookies**
Laravel 框架創建的所有 cookies 都經過加密并使用一個認證碼進行簽名,這意味著如果客戶端修改了它們則需要對其進行有效性驗證。我們使用 ?`Illuminate\Http\Request`?實例的?`cookie?`方法從請求中獲取 cookie 的值:
~~~
$value = $request->cookie('name');
~~~
**新增Cookie到響應**
Laravel 提供了一個全局的輔助函數?`cookie`?作為一個簡單工廠來生成新的`Symfony\Component\HttpFoundation\Cookie`?實例,新增的 cookie 通過?`withCookie`?方法被附加到`Illuminate\Http\Response`?實例:
~~~
$response = new Illuminate\Http\Response('Hello World');
$response->withCookie(cookie('name', 'value', $minutes));
return $response;
~~~
想要創建一個長期有效的 cookie,可以使用 cookie 工廠的?`forever?`方法:
~~~
$response->withCookie(cookie()->forever('name', 'value'));
~~~
#### **[文件上傳](http://laravelacademy.org/tags/%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0 "View all posts in 文件上傳")**
**獲取上傳的文件**
可以使用?`Illuminate\Http\Request`?實例的?`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/2.7/Symfony/Component/HttpFoundation/File/UploadedFile.html)?了解更多相關方法。
- 序言
- 發行版本說明
- 升級指南
- 貢獻代碼
- 開始
- 安裝
- 配置
- Laravel Homestead
- 基礎
- HTTP 路由
- HTTP 中間件
- HTTP 控制器
- HTTP 請求
- HTTP 響應
- 視圖
- Blade 模板引擎
- 架構
- 一次請求的生命周期
- 應用目錄結構
- 服務提供者
- 服務容器
- 門面(Facades)
- 數據庫
- 起步
- 查詢構建器
- 遷移
- 填充數據
- Eloquent ORM
- 起步
- 關聯關系
- 集合
- 訪問器&修改器
- 序列化
- 服務
- 用戶認證
- 用戶授權
- Artisan Console
- 訂閱支付實現:Laravel Cashier
- 緩存
- 集合
- 集成前端資源:Laravel Elixir
- 加密
- 錯誤&日志
- 事件
- 文件系統/云存儲
- 哈希
- 輔助函數
- 本地化
- 郵件
- 包開發
- 分頁
- Redis
- 隊列
- Session
- Envoy Task Runner
- 任務調度
- 測試
- 驗證
- 新手入門指南
- 簡單任務管理系統
- 帶用戶功能的任務管理系統