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

HTTP 請(qǐng)求

1、訪問(wèn)請(qǐng)求

通過(guò)依賴注入獲取當(dāng)前 HTTP 請(qǐng)求實(shí)例,應(yīng)該在控制器的構(gòu)造函數(shù)或方法中對(duì) Illuminate\Http\Request 類進(jìn)行類型提示,當(dāng)前請(qǐng)求實(shí)例會(huì)被服務(wù)容器自動(dòng)注入:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

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

        //
    }
}

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

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

你仍然可以對(duì) Illuminate\Http\Request 進(jìn)行類型提示并通過(guò)如下方式定義控制器方法來(lái)訪問(wè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 基本請(qǐng)求信息

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

1.1.1 獲取請(qǐng)求 URI

path 方法將會(huì)返回請(qǐng)求的 URI,因此,如果進(jìn)入的請(qǐng)求路徑是 http://domain.com/foo/bar,則 path 方法將會(huì)返回 foo/bar

$uri=$request->path();

is 方法允許你驗(yàn)證進(jìn)入的請(qǐng)求是否與給定模式匹配。使用該方法時(shí)可以使用*通配符:

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

想要獲取完整的 URL,而不僅僅是路徑信息,可以使用請(qǐng)求實(shí)例中的 url 方法:

$url=$request->url();

1.1.2 獲取請(qǐng)求方法

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

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

1.2 PSR-7 請(qǐng)求

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

composer require symfony/psr-http-message-bridge
composer require zendframework/zend-diactoros

安裝完這些庫(kù)之后,你只需要在路由或控制器中通過(guò)對(duì)請(qǐng)求類型進(jìn)行類型提示就可以獲取 PSR-7 請(qǐng)求:

use Psr\Http\Message\ServerRequestInterface;

Route::get('/', function (ServerRequestInterface $request) {
    //
});

如果從路由或控制器返回的是 PSR-7 響應(yīng)實(shí)例,則其將會(huì)自動(dòng)轉(zhuǎn)化為 Laravel 響應(yīng)實(shí)例并顯示出來(lái)。

2、獲取輸入

獲取輸入值 使用一些簡(jiǎn)單的方法,就可以從 Illuminate\Http\Request 實(shí)例中訪問(wèn)用戶輸入。你不需要擔(dān)心請(qǐng)求所使用的 HTTP 請(qǐng)求方法,因?yàn)閷?duì)所有請(qǐng)求方式的輸入訪問(wèn)接口都是一致的:

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

你還可以傳遞一個(gè)默認(rèn)值作為第二個(gè)參數(shù)給 input 方法,如果請(qǐng)求輸入值在當(dāng)前請(qǐng)求未出現(xiàn)時(shí)該值將會(huì)被返回:

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

處理表單數(shù)組輸入時(shí),可以使用”.”來(lái)訪問(wèn)數(shù)組:

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

判斷輸入值是否出現(xiàn) 判斷值是否在請(qǐng)求中出現(xiàn),可以使用 has 方法,如果值出現(xiàn)過(guò)了且不為空,has 方法返回 true

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

獲取所有輸入數(shù)據(jù) 你還可以通過(guò) all 方法獲取所有輸入數(shù)據(jù):

$input = $request->all();

獲取輸入的部分?jǐn)?shù)據(jù) 如果你需要取出輸入數(shù)據(jù)的子集,可以使用 onlyexcept 方法,這兩個(gè)方法都接收一個(gè)數(shù)組作為唯一參數(shù):

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

2.1 上一次請(qǐng)求輸入

Laravel 允許你在兩次請(qǐng)求之間保存輸入數(shù)據(jù),這個(gè)特性在檢測(cè)校驗(yàn)數(shù)據(jù)失敗后需要重新填充表單數(shù)據(jù)時(shí)很有用,但如果你使用的是 Laravel 內(nèi)置的驗(yàn)證服務(wù),則不需要手動(dòng)使用這些方法,因?yàn)橐恍?Laravel 內(nèi)置的校驗(yàn)設(shè)置會(huì)自動(dòng)調(diào)用它們。

2.1.1 將輸入存儲(chǔ)到一次性 Session

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

$request->flash();

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

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

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

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

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

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

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

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

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

{{ old('username') }}

2.2 Cookies

2.2.1 從請(qǐng)求中取出 Cookies

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

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

2.2.2 新增 Cookie

Laravel 提供了一個(gè)全局的幫助函數(shù) cookie 作為一個(gè)簡(jiǎn)單工廠來(lái)生成新的 Symfony\Component\HttpFoundation\Cookie 實(shí)例,新增的 cookies 通過(guò) withCookie 方法被附加到 Illuminate\Http\Response 實(shí)例:

$response = new Illuminate\Http\Response('Hello World');
$response->withCookie(cookie('name', 'value', $minutes));
return $response;

想要?jiǎng)?chuàng)建一個(gè)長(zhǎng)期有效的 cookie,可以使用 cookie 工廠的 forever 方法:

$response->withCookie(cookie()->forever('name', 'value'));

2.3 文件上傳

2.3.1 獲取上傳的文件

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

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

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

使用 hasFile 方法判斷文件在請(qǐng)求中是否存在:

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

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

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

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

2.3.4 保存上傳的文件

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

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

2.3.5 其它文件方法

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

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