Laravel Http 層 請求

訪問請求實例

要通過依賴注入獲取當前 HTTP 請求實例斧蜕,需要在控制器的構(gòu)造函數(shù)或方法中對 Illuminate\Http\Request 類進行類型提示漫谷,這樣當前請求實例會被服務(wù)容器自動注入:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * 存儲新用戶
     *
     * @param Request $request
     * @return Response
     */
    public function store(Request $request)
    {
        $name=$request->input('name');

        //
    }
}

依賴注入 & 路由參數(shù)

如果你的控制器方法還期望獲取路由參數(shù),只需要將路由參數(shù)置于其它依賴之后即可拿霉,例如,如果你的路由定義如下:

Route::put('user/{id}','UserController@update');

你仍然可以對 Illuminate\Http\Request
進行類型提示并通過如下方式定義控制器方法來訪問路由參數(shù) id

<?php
  namespace App\Http\Controllers;
  use Illuminate\Http\Request;
class UserController extends Controller{ 
/**
 * 更新指定用戶
 *
 * @param Request $request
 * @param int $id
 * @return Response
 */ 
public function update(Request $request,$id) {
 //
 }
}

通過路由閉包訪問請求
還可以在路由閉包上類型提示 Illuminate\Http\Request
類,在執(zhí)行的時候服務(wù)容器會自動注入輸入的請求到閉包:

use Illuminate\Http\Request;
Route::get('/', function (Request $request) {
 //
});

請求路徑 & 方法

Illuminate\Http\Request實例提供了多個方法來檢測應(yīng)用的 HTTP 請求迎捺,Laravel 的 Illuminate\Http\Request繼承自 Symfony\Component\HttpFoundation\Request類,下面演示了該類提供的一些有用方法:

獲取請求路徑
path 方法將會返回請求的路徑信息查排,因此凳枝,如果進入的請求路徑是 http://domain.com/foo/bar,則 path 方法將會返回 foo/bar

$uri=$request->path();

is 方法允許你驗證進入的請求是否與給定模式匹配跋核。使用該方法時可以使用 * 通配符:

if($request->is('admin/*')){ 
  //
}

獲取請求URL

想要獲取完整的 URL岖瑰,而不僅僅是路徑信息,可以使用請求實例提供的 urlfullUrl 方法砂代,url 方法將會返回不帶查詢字符串的 URL蹋订,而 fullUrl 方法返回結(jié)果則包含查詢字符串:

// 不包含查詢字符串
$url = $request->url();
// 包含查詢字符串
$url = $request->fullUrl();

獲取請求方法
method
方法將會返回 HTTP 請求方式。你還可以使用 isMethod
方法來驗證 HTTP 請求方式是否匹配給定字符串:
$method=$request->method();if($request->isMethod('post')){ //}

PSR-7 請求

PSR-7 標準指定了 HTTP 消息接口刻伊,包括請求和響應(yīng)露戒。如果你想要獲取 PSR-7 請求實例,首先需要安裝一些庫捶箱,Laravel 使用 Symfony HTTP Message Bridge 組件將典型的 Laravel 請求和響應(yīng)轉(zhuǎn)化為 兼容PSR-7的實現(xiàn):

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 響應(yīng)實例,則其將會自動轉(zhuǎn)化為 Laravel 響應(yīng)實例并顯示出來讼呢。

輸入修整 & 正沉寐梗化

默認情況下,Laravel 在 App\Http\Kernel 的全局中間件堆棧中引入了 TrimStringsConvertEmptyStringsToNull 中間件悦屏。這些中間件會自動對請求中的字符串字段進行處理节沦,前者將字符串兩端的空格清除,后者將空字符串轉(zhuǎn)化為 null础爬。這樣甫贯,在路由和控制器中我們就不必對字符串字段做額外的處理。

如果你想要禁止該行為看蚜,可以從App\Http\Kernel 的中間件堆棧屬性 $middleware 中移除這兩個中間件叫搁。

獲取請求輸入

獲取所有輸入值
你可以使用 all 方法以數(shù)組格式獲取所有輸入值:

$input = $request->all();

獲取單個輸入值
使用一些簡單的方法,就可以從 Illuminate\Http\Request 實例中訪問用戶輸入。你不需要關(guān)心請求所使用的 HTTP 請求方法渴逻,因為對所有請求方式的輸入都是通過input 方法獲取用戶輸入:

$name = $request->input('name');

你還可以傳遞一個默認值作為第二個參數(shù)給 input 方法疾党,如果請求輸入值在當前請求未出現(xiàn)時該值將會被返回:

$name = $request->input('name', 'Sally');

處理表單數(shù)組輸入時,可以使用”.”來訪問數(shù)組輸入:

$input = $request->input('products.0.name');
$names = $request->input('products.*.name');

通過動態(tài)屬性獲取輸入

此外惨奕,你還可以通過使用 Illuminate\Http\Request 實例上的動態(tài)屬性來訪問用戶輸入雪位。例如,如果你的應(yīng)用表單包含 name字段梨撞,那么可以像這樣訪問提交的值:

$name = $request->name;

使用動態(tài)屬性的時候雹洗,Laravel 首先會在請求中查找參數(shù)的值,如果不存在卧波,還會到路由參數(shù)中查找时肿。

獲取JSON輸入值
發(fā)送JSON請求到應(yīng)用的時候,只要 Content-Type 請求頭被設(shè)置為 application/json港粱,都可以通過input 方法獲取 JSON 數(shù)據(jù)螃成,還可以通過“.”號解析數(shù)組:

$name = $request->input('user.name');

獲取輸入的部分數(shù)據(jù)

如果你需要取出輸入數(shù)據(jù)的子集,可以使用 onlyexcept 方法啥容,這兩個方法都接收一個數(shù)組或動態(tài)列表作為唯一參數(shù):

$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
$input = $request->except('credit_card');

only 方法返回你所請求的所有鍵值對锈颗,即使輸入請求中不包含你所請求的鍵,當對應(yīng)鍵不存在時咪惠,對應(yīng)返回值為 null 击吱,如果你想要獲取輸入請求中確實存在的部分數(shù)據(jù),可以使用 intersect 方法:

$input = $request->intersect(['username', 'password']);

判斷輸入值是否存在

判斷值是否在請求中存在遥昧,可以使用 has 方法覆醇,如果值出現(xiàn)過了且不為空,has 方法返回 true

if ($request->has('name')) {
 //
}

上一次請求輸入

Laravel 允許你在兩次請求之間保存輸入數(shù)據(jù)炭臭,這個特性在檢測校驗數(shù)據(jù)失敗后需要重新填充表單數(shù)據(jù)時很有用永脓,但如果你使用的是 Laravel 自帶的驗證服務(wù),則不需要手動使用這些方法鞋仍,因為一些 Laravel 自帶的校驗設(shè)置會自動調(diào)用它們常摧。

將輸入存儲到一次性 Session
Illuminate\Http\Request 實例的 flash 方法會將當前輸入存放到一次性 Session(所謂的一次性指的是從 Session 中取出數(shù)據(jù)后,對應(yīng)數(shù)據(jù)會從 Session 中銷毀)中威创,這樣在下一次請求時數(shù)據(jù)依然有效:

$request->flash();

你還可以使用 flashOnlyflashExcept 方法將輸入數(shù)據(jù)子集存放到 Session 中落午,這些方法在 Session 之外保存敏感信息時很有用:

$request->flashOnly('username', 'email');
$request->flashExcept('password');

將輸入存儲到一次性 Session 然后重定向

如果你經(jīng)常需要一次性存儲輸入并重定向到前一頁,可以使用 withInput 方法來將輸入數(shù)據(jù)添加到 redirect后面:

return redirect('form')->withInput();
return redirect('form')->withInput($request->except('password'));

取出上次請求數(shù)據(jù)
要從 Session 中取出上次請求的輸入數(shù)據(jù)肚豺,可以使用 Request 實例的 old方法溃斋。old 方法可以很方便地從Session 中取出一次性數(shù)據(jù):

$username = $request->old('username');

Laravel 還提供了一個全局的輔助函數(shù) old ,如果你是在 Blade 模板中顯示上次輸入數(shù)據(jù)吸申,使用輔助函數(shù) old 更方便梗劫,如果給定參數(shù)沒有對應(yīng)輸入享甸,返回null

<input type="text" name="username" value="{{ old('username') }}">

文件上傳

獲取上傳的文件

可以使用 Illuminate\Http\Request 實例提供的 file 方法或者動態(tài)屬性來訪問上傳文件, file 方法返回Illuminate\Http\UploadedFile 類的一個實例梳侨,該類繼承自 PHP 標準庫中提供與文件交互方法的 SplFileInfo類:

$file = $request->file('photo');$file = $request->photo;

你可以使用 hasFile 方法判斷文件在請求中是否存在:

if ($request->hasFile('photo')) {
 //
}

驗證文件是否上傳成功
使用 isValid 方法判斷文件在上傳過程中是否出錯:

if ($request->file('photo')->isValid()){
 //
}

文件路徑 & 擴展名
UploadedFile 類還提供了訪問上傳文件絕對路徑和擴展名的方法蛉威。 extension 方法可以基于文件內(nèi)容判斷文件擴展名,該擴展名可能會和客戶端提供的擴展名不一致:

$path = $request->photo->path();
$extension = $request->photo->extension();

其他文件方法
UploadedFile 實例上還有很多其他可用方法猫妙,查看該類的API文檔了解更多信息瓷翻。

保存上傳的文件

要保存上傳的文件,通常需要使用你所配置的其中一個文件系統(tǒng)割坠, UploadedFile 類有一個 store 方法,該方法會將上傳文件移動到相應(yīng)的磁盤路徑上妒牙,該路徑可以是本地文件系統(tǒng)的某個位置彼哼,也可以是云存儲(如Amazon S3)上的路徑。

store 方法接收一個文件保存的相對路徑(相對于文件系統(tǒng)配置的根目錄 )湘今,該路徑不應(yīng)該包含文件名敢朱,因為系統(tǒng)會自動生成一個唯一ID作為文件名。

store 方法還接收一個可選的參數(shù)——用于存儲文件的磁盤名稱作為第二個參數(shù)摩瞎,該方法會方返回相對于根目錄的文件路徑:

$path = $request->photo->store('images');
$path = $request->photo->store('images', 's3');

如果你不想自動生成文件名拴签,可以使用 storeAs方法,該方法接收保存路徑旗们、文件名和磁盤名作為參數(shù):

$path = $request->photo->storeAs('images', 'filename.jpg');
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚓哩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子上渴,更是在濱河造成了極大的恐慌岸梨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稠氮,死亡現(xiàn)場離奇詭異曹阔,居然都是意外死亡,警方通過查閱死者的電腦和手機隔披,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門赃份,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奢米,你說我怎么就攤上這事抓韩。” “怎么了恃慧?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵园蝠,是天一觀的道長。 經(jīng)常有香客問我痢士,道長彪薛,這世上最難降的妖魔是什么茂装? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮善延,結(jié)果婚禮上少态,老公的妹妹穿的比我還像新娘。我一直安慰自己易遣,他們只是感情好彼妻,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著豆茫,像睡著了一般侨歉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上揩魂,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天幽邓,我揣著相機與錄音,去河邊找鬼火脉。 笑死牵舵,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的倦挂。 我是一名探鬼主播畸颅,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼方援!你這毒婦竟也來了没炒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤肯骇,失蹤者是張志新(化名)和其女友劉穎窥浪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笛丙,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡漾脂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胚鸯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骨稿。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姜钳,靈堂內(nèi)的尸體忽然破棺而出坦冠,到底是詐尸還是另有隱情,我是刑警寧澤哥桥,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布辙浑,位于F島的核電站,受9級特大地震影響拟糕,放射性物質(zhì)發(fā)生泄漏判呕。R本人自食惡果不足惜倦踢,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侠草。 院中可真熱鬧辱挥,春花似錦、人聲如沸边涕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽功蜓。三九已至园爷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霞赫,已是汗流浹背腮介。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留端衰,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓甘改,卻偏偏與公主長得像旅东,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子十艾,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 先說幾句廢話抵代,調(diào)和氣氛。事情的起由來自客戶需求頻繁變更忘嫉,偉大的師傅決定橫刀立馬的改革使用新的框架(created ...
    wsdadan閱讀 3,039評論 0 12
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理荤牍,服務(wù)發(fā)現(xiàn),斷路器庆冕,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 1康吵、簡介 Laravel 提供了多種方法來驗證應(yīng)用輸入數(shù)據(jù)。默認情況下访递,Laravel 的控制器基類使用Valid...
    伊Summer閱讀 1,521評論 0 3
  • HTTP請求 訪問請求 為了通過依賴注入能夠方便的獲取http請求實例晦嵌,你應(yīng)該在控制器的構(gòu)造函數(shù)或者控制函數(shù)中寫入...
    Dearmadman閱讀 2,418評論 0 5
  • 今天我來分享 Laravel 中 HTTP 層關(guān)于請求响巢、響應(yīng)與表單驗證的知識描滔。 0x00 HTTP 請求 獲取請求...
    胖福哥閱讀 1,358評論 1 20