通過依賴注入獲取當(dāng)前 HTTP 請求實(shí)例,應(yīng)該在控制器的構(gòu)造函數(shù)或方法中對 Illuminate\Http\Request
類進(jìn)行類型提示,當(dāng)前請求實(shí)例會被服務(wù)容器自動注入:
<?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');
//
}
}
如果你的控制器方法還期望獲取路由參數(shù)輸入,只需要將路由參數(shù)置于其它依賴之后即可,例如,如果你的路由定義如下:
Route::put('user/{id}','UserController@update');
你仍然可以對 Illuminate\Http\Request
進(jìn)行類型提示并通過如下方式定義控制器方法來訪問路由參數(shù):
<?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
實(shí)例提供了多個方法來檢測應(yīng)用的 HTTP 請求,Laravel 的 Illuminate\Http\Request
繼承自 Symfony\Component\HttpFoundation\Request
類,這里列出了一些該類中的有用方法:
path 方法將會返回請求的 URI,因此,如果進(jìn)入的請求路徑是 http://domain.com/foo/bar
,則 path
方法將會返回 foo/bar
:
$uri=$request->path();
is
方法允許你驗(yàn)證進(jìn)入的請求是否與給定模式匹配。使用該方法時可以使用*
通配符:
if($request->is('admin/*')){
//
}
想要獲取完整的 URL,而不僅僅是路徑信息,可以使用請求實(shí)例中的 url
方法:
$url=$request->url();
method
方法將會返回請求的 HTTP 請求方式。你還可以使用 isMethod
方法來驗(yàn)證 HTTP 請求方式是否匹配給定字符串:
$method=$request->method();
if($request->isMethod('post')){
//
}
PSR-7 標(biāo)準(zhǔn)指定了 HTTP 消息接口,包括請求和響應(yīng)。如果你想要獲取 PSR-7 請求實(shí)例,首先需要安裝一些庫,Laravel 使用 Symfony HTTP Message Bridge 組件將典型的 Laravel 請求和響應(yīng)轉(zhuǎn)化為 PSR-7 兼容的實(shí)現(xiàn):
composer require symfony/psr-http-message-bridge
composer require zendframework/zend-diactoros
安裝完這些庫之后,你只需要在路由或控制器中通過對請求類型進(jìn)行類型提示就可以獲取 PSR-7 請求:
use Psr\Http\Message\ServerRequestInterface;
Route::get('/', function (ServerRequestInterface $request) {
//
});
如果從路由或控制器返回的是 PSR-7 響應(yīng)實(shí)例,則其將會自動轉(zhuǎn)化為 Laravel 響應(yīng)實(shí)例并顯示出來。
獲取輸入值
使用一些簡單的方法,就可以從 Illuminate\Http\Request
實(shí)例中訪問用戶輸入。你不需要擔(dān)心請求所使用的 HTTP 請求方法,因?yàn)閷λ姓埱蠓绞降妮斎朐L問接口都是一致的:
$name = $request->input('name');
你還可以傳遞一個默認(rèn)值作為第二個參數(shù)給 input
方法,如果請求輸入值在當(dāng)前請求未出現(xiàn)時該值將會被返回:
$name = $request->input('name', 'Sally');
處理表單數(shù)組輸入時,可以使用”.”來訪問數(shù)組:
$input = $request->input('products.0.name');
判斷輸入值是否出現(xiàn)
判斷值是否在請求中出現(xiàn),可以使用 has
方法,如果值出現(xiàn)過了且不為空,has
方法返回 true
:
if ($request->has('name')) {
//
}
獲取所有輸入數(shù)據(jù)
你還可以通過 all
方法獲取所有輸入數(shù)據(jù):
$input = $request->all();
獲取輸入的部分?jǐn)?shù)據(jù)
如果你需要取出輸入數(shù)據(jù)的子集,可以使用 only
或 except
方法,這兩個方法都接收一個數(shù)組作為唯一參數(shù):
$input = $request->only('username', 'password');
$input = $request->except('credit_card');
Laravel 允許你在兩次請求之間保存輸入數(shù)據(jù),這個特性在檢測校驗(yàn)數(shù)據(jù)失敗后需要重新填充表單數(shù)據(jù)時很有用,但如果你使用的是 Laravel 內(nèi)置的驗(yàn)證服務(wù),則不需要手動使用這些方法,因?yàn)橐恍?Laravel 內(nèi)置的校驗(yàn)設(shè)置會自動調(diào)用它們。
Illuminate\Http\Request
實(shí)例的 flash
方法會將當(dāng)前輸入存放到一次性 session(所謂的一次性指的是從 session 中取出數(shù)據(jù)中,對應(yīng)數(shù)據(jù)會從 session 中銷毀)中,這樣在下一次請求時數(shù)據(jù)依然有效:
$request->flash();
你還可以使用 flashOnly
和 flashExcept
方法將輸入數(shù)據(jù)子集存放到 session 中:
$request->flashOnly('username', 'email');
$request->flashExcept('password');
如果你經(jīng)常需要一次性存儲輸入并重定向到前一頁,可以簡單使用 withInput
方法來將輸入數(shù)據(jù)鏈接到 redirect
后面:
return redirect('form')->withInput();
return redirect('form')->withInput($request->except('password'));
要從 session 中取出上次請求的輸入數(shù)據(jù),可以使用 Request 實(shí)例的 old
方法。old
方法提供了便利的方式從 session 中取出一次性數(shù)據(jù):
$username = $request->old('username');
Laravel 還提供了一個全局的幫助函數(shù) old
,如果你是在 Blade 模板中顯示老數(shù)據(jù),使用幫助函數(shù) old
更方便:
{{ old('username') }}
Laravel 框架創(chuàng)建的所有 cookies 都經(jīng)過加密并使用一個認(rèn)證碼進(jìn)行簽名,這意味著如果客戶端修改了它們則需要對其進(jìn)行有效性驗(yàn)證。我們使用 Illuminate\Http\Request
實(shí)例的 cookie 方法從請求中獲取 cookie 的值:
$value = $request->cookie('name');
Laravel 提供了一個全局的幫助函數(shù) cookie 作為一個簡單工廠來生成新的 Symfony\Component\HttpFoundation\Cookie 實(shí)例,新增的 cookies 通過 withCookie
方法被附加到 Illuminate\Http\Response
實(shí)例:
$response = new Illuminate\Http\Response('Hello World');
$response->withCookie(cookie('name', 'value', $minutes));
return $response;
想要創(chuàng)建一個長期有效的 cookie,可以使用 cookie 工廠的 forever 方法:
$response->withCookie(cookie()->forever('name', 'value'));
可以使用 Illuminate\Http\Request
實(shí)例的 file
方法來訪問上傳文件,該方法返回的對象是 Symfony\Component\HttpFoundation\File\UploadedFile
類的一個實(shí)例,該類繼承自 PHP 標(biāo)準(zhǔn)庫中提供與文件交互方法的 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
實(shí)例中很有很多其它方法,查看該類的 API 了解更多相關(guān)方法。