為了通過依賴注入能夠方便的擷取http請求執行個體,你應該在控制器的建構函式或者控制函數中寫入型別宣告Illuminate\Http\Request。當前請求的執行個體會自動的從服務容器中注入:
基礎的請求資訊
Illuminate\Http\Request的執行個體為你的應用提供了多種檢查HTTP請求的方法,它繼承自Symfony\Component\HttpFoundation\Request。這裡列舉了一些常用的方法:
檢索請求的URI
path方法返回請求的URI.所以,當請求的目標地址是http://domain.com/foo/bar時,path方法將返回foo/bar:
$uri = $request->path();
is方法允許你來效驗所請求的URI是否匹配所提供的模式。你可以使用 *字元來作為萬用字元:
if ($request->is('admin/*')) { //} 如果你想得到請求的完整路徑,那麼你可以使用 url 或 fullUrl 方法:
// Without Query String...$url = $request->url();// With Query String...$url = $request->fullUrl();
你也可以在擷取完整請求路徑的同時追加請求的參數資訊,例如,如果請求的目標是 http://domain.com/foo, 下面的方法將返回http://domain.com/foo?bar=baz:
$url = $request->fullUrlWithQuery(['bar' => 'baz']);
檢索請求的方式
method方法將返回HTTP請求的方式。你也可以使用isMethod方法來進行http請求方式的匹配效驗:
$method = $request->method();if ($request->isMethod('post')) { //} PSR-7 請求
PSR-7標準為http指定了一些訊息介面,包括請求和響應.如果你想獲得PSR-7請求的執行個體,你需要先安裝一些支援庫,laravel使用了 Symfon HTTP Bridge 組件來轉換典型的laravel請求和響應為PSR-7相容的實現:
composer require symfony/psr-http-message-bridgecomposer require zendframework/zend-diactoros
一旦你安裝了這些庫,你就可以簡單在你的路由或控制器中使用類型提示來擷取PSR-7請求:
use Psr\Http\Message\ServerRequestInterface;Route::get('/', function (ServerRequestInterface $request) { // }); 如果路由或控制器返回的是PSR-7響應的執行個體, 那麼它會自動的轉換為laravel響應執行個體。
擷取輸入值
擷取輸入的值
你可以通過Illuminate\Http\Request執行個體的一些方法來簡便的擷取使用者的輸入值.而且你並不需要去關心使用者所使用的HTTP請求方式,你可以通過input方法擷取所有請求方式的值:
$name = $request->input('name'); 你也可以傳遞第二個參數到input方法,如果該值並不存在於請求中,將作為預設值返回:
$name = $request->input('name', 'Sally'); 當表單提交的一些輸入值是數組時,你可以使用.操作符來訪問請求中的數組值:
$name = $request->input('products.0.name');$names = $request->input('products.*.name'); 擷取JSON請求的輸入值
你同樣可以使用input方法來訪問json請求,只要json請求被設定了正確的要求標頭 Content-Type: application/json, 那麼你就可以使用 . 文法來深入訪問json中的數組:
$name = $request->input('user.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'); 動態屬性
你可以通過Illuminat\Http\Request的執行個體的動態屬性來擷取使用者的輸入值.如果你的應用表單中存在name欄位,你可以通過下面的方式來擷取該請求欄位:
$name = $request->name;
當使用動態屬性時,laravel會首先尋找請求中是否包含該值,然後才會檢索路由中的參數.
舊的輸入
laravel允許你在下一次請求期間保持該次請求的輸入。這種特性在表單驗證出錯時尤其有用,它可以使你複用上一次的請求進行自動的填充。如果你使用了laravel的驗證服務,那麼你不需要手動的調用它們,因為laravel內建的驗證機制會自動的調用它們。
快閃記憶體輸入到會話
Illuminate\Http\Request執行個體的flash方法會快閃記憶體當前請求的輸入到會話中,這樣可以使應用在接受使用者的下次請求時進行複用:
$request->flash();
你也可以使用flashOnly和 flashExcept 方法來快閃記憶體部分請求輸入到會話:
$request->flashOnly(['username', 'email']);$request->flashExcept('password'); 快閃記憶體輸入到會話接著跳轉
一個常用的情境就是你需要連同使用者的輸入一起返回到上一頁中,那麼你可以使用withInput鏈式方法:
return redirect('form')->withInput();return redirect('form')->withInput($request->except('password')); 擷取舊輸入
你可以使用old方法來擷取上一次請求所快閃記憶體的使用者請求:
$username = $request->old('username'); laravel提供了全域old協助方法。你也可以在blade模板中使用該方法,如果上次請求未快閃記憶體該輸入,則會返回null:
Cookies
從請求中檢索cookie
在laravel中所有的cookie在被建立時都會經過一個認證碼進行簽證加密,這就意味著laravel會驗證用戶端對cookie的修改.你可以使用Illuminate\Http\Request執行個體的cookie方法來擷取cookie值:
$value = $request->cookie('name'); 在響應中附加一個新的cookie
laravel提供了一個全域的cookie協助方法用來產生一個Symfony\Component\HttpFoundation\Cookie執行個體,該執行個體可以被Illuminate\Http\Response執行個體的withCookie附加:
$response = new Illuminate\Http\Response('Hello World');$response->withCookie('name', 'value', $minutes);return $response; 你可以使用cookie方法來建立一個長達5年的長cookie,它要求你使用不帶參數的cookie協助方法直接調用forever方法:
$response->withCookie(cookie()->forever('name', 'value')); 檔案
擷取上傳的檔案
你可以通過Illuminate\Http\Request的file方法來訪問上傳的檔案。該方法會返回一個Symfony\Component\HttpFoundation\File\UploadedFile類的執行個體,它繼承自SplFileInfo,提供了多種與檔案互動的方法:
$file = $request->file('photo'); 你可以使用hasFile方法來判斷檔案在請求中是否存在:
if ($request->hasFile('photo')) { // } 驗證檔案是否上傳成功
你可以使用isValid方法來驗證檔案上傳的過程中是否出錯:
if ($request->file('photo')->isValid()) { //} 移動上傳的檔案
你可以使用move方法來將上傳的檔案從臨時目錄中遷移到指定的目錄中:
$request->file('photo')->move($destinationPath);$request->file('photo')->move($destinationPath, $fileName); 其他檔案方法
UploadedFile還有其他許多可用的方法,你可以查看 該類的API文檔 來瞭解更多.