laravel基礎教程 -- 請求

來源:互聯網
上載者:User

HTTP請求

訪問請求

為了通過依賴注入能夠方便的擷取http請求執行個體,你應該在控制器的建構函式或者控制函數中寫入型別宣告Illuminate\Http\Request。當前請求的執行個體會自動的從服務容器中注入:

input('name');  }}

如果你的控制器方法也需要接收來自路由的參數,那麼你需要在進行依賴注入的參數之後添加要接收的參數。例如,你的路由是這麼定義的:

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

那麼你應該先聲明依賴注入Illuminate\Http\Reqeust,然後再按序的傳遞路由參數:

   

基礎的請求資訊

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文檔 來瞭解更多.

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.