鍍金池/ 教程/ PHP/ HTTP 請求
門面
Laravel Homestead
安裝及配置
測試
HTTP 中間件
加密
升級指南
幫助函數(shù)
應(yīng)用目錄結(jié)構(gòu)
集合
新手入門指南-簡單任務(wù)管理系統(tǒng)
任務(wù)調(diào)度
查詢構(gòu)建器
視圖
驗(yàn)證
Laravel Cashier(訂購&支付&發(fā)票)
本地化
隊(duì)列
調(diào)整器
分頁
文件系統(tǒng)/云存儲
貢獻(xiàn)代碼
哈希
HTTP 控制器
緩存
遷移
HTTP 請求
Laravel Elixir
發(fā)行版本說明
Envoy 任務(wù)運(yùn)行器(SSH任務(wù))
序列化
Session
起步
帶用戶功能的任務(wù)管理系統(tǒng)
起步
用戶授權(quán)
郵件
事件
填充數(shù)據(jù)
HTTP 路由
服務(wù)提供者
Blade 模板引擎
包開發(fā)
用戶認(rèn)證
Artisan 控制臺
HTTP 響應(yīng)
集合
服務(wù)容器
關(guān)聯(lián)關(guān)系
一次請求的生命周期
契約
Redis
錯誤&日志

HTTP 請求

1、訪問請求

通過依賴注入獲取當(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)
    { 
        //
    }
}

1.1 基本請求信息

Illuminate\Http\Request 實(shí)例提供了多個方法來檢測應(yīng)用的 HTTP 請求,Laravel 的 Illuminate\Http\Request 繼承自 Symfony\Component\HttpFoundation\Request 類,這里列出了一些該類中的有用方法:

1.1.1 獲取請求 URI

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();

1.1.2 獲取請求方法

method 方法將會返回請求的 HTTP 請求方式。你還可以使用 isMethod 方法來驗(yàn)證 HTTP 請求方式是否匹配給定字符串:

$method=$request->method();
if($request->isMethod('post')){ 
    //
}

1.2 PSR-7 請求

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í)例并顯示出來。

2、獲取輸入

獲取輸入值 使用一些簡單的方法,就可以從 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ù)的子集,可以使用 onlyexcept 方法,這兩個方法都接收一個數(shù)組作為唯一參數(shù):

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

2.1 上一次請求輸入

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)用它們。

2.1.1 將輸入存儲到一次性 Session

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

$request->flash();

你還可以使用 flashOnlyflashExcept 方法將輸入數(shù)據(jù)子集存放到 session 中:

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

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

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

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

2.1.3 取出上次請求數(shù)據(jù)

要從 session 中取出上次請求的輸入數(shù)據(jù),可以使用 Request 實(shí)例的 old 方法。old 方法提供了便利的方式從 session 中取出一次性數(shù)據(jù):

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

Laravel 還提供了一個全局的幫助函數(shù) old,如果你是在 Blade 模板中顯示老數(shù)據(jù),使用幫助函數(shù) old 更方便:

{{ old('username') }}

2.2 Cookies

2.2.1 從請求中取出 Cookies

Laravel 框架創(chuàng)建的所有 cookies 都經(jīng)過加密并使用一個認(rèn)證碼進(jìn)行簽名,這意味著如果客戶端修改了它們則需要對其進(jìn)行有效性驗(yàn)證。我們使用 Illuminate\Http\Request 實(shí)例的 cookie 方法從請求中獲取 cookie 的值:

$value = $request->cookie('name');

2.2.2 新增 Cookie

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'));

2.3 文件上傳

2.3.1 獲取上傳的文件

可以使用 Illuminate\Http\Request 實(shí)例的 file 方法來訪問上傳文件,該方法返回的對象是 Symfony\Component\HttpFoundation\File\UploadedFile 類的一個實(shí)例,該類繼承自 PHP 標(biāo)準(zhǔn)庫中提供與文件交互方法的 SplFileInfo 類:

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

2.3.2 驗(yàn)證文件是否存在

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

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

2.3.3 驗(yàn)證文件是否上傳成功

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

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

2.3.4 保存上傳的文件

使用 move 方法將上傳文件保存到新的路徑,該方法將上傳文件從臨時目錄(在 PHP 配置文件中配置)移動到指定新目錄:

$request->file('photo')->move($destinationPath);
$request->file('photo')->move($destinationPath, $fileName);

2.3.5 其它文件方法

UploadedFile 實(shí)例中很有很多其它方法,查看該類的 API 了解更多相關(guān)方法。

上一篇:郵件下一篇:遷移