Lumen HTTP 請(qǐng)求

2021-09-15 14:39 更新

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ù)置于其它依賴之后即可,例如,如果你的路由定義如下:

$app->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)求,Lumen的Illuminate\Http\Request繼承自Symfony\Component\HttpFoundation\Request類,這里列出了一些該類中的有用方法:

獲取請(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();

 獲取請(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ù),Lumen使用Symfony HTTP Message Bridge組件將典型的Lumen請(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;

$app->get('/', function (ServerRequestInterface $request) {
    //
});

如果從路由或控制器返回的是PSR-7響應(yīng)實(shí)例,則其將會(huì)自動(dòng)轉(zhuǎn)化為L(zhǎng)umen響應(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 老的輸入

注意:在使用該特性前必須開(kāi)啟session。

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

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

Illuminate\Http\Request實(shí)例的flash方法會(huì)將當(dāng)前輸入存放到一次性session中,這樣在下一次請(qǐng)求時(shí)數(shù)據(jù)依然有效:

$request->flash();

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

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

將輸入存儲(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'));

取出老數(shù)據(jù)

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

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

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

{{ old('username') }}

2.2 Cookies

要強(qiáng)制所有cookies被加密和簽名,需要取消 bootstrap/app.php文件中EncryptCookies 中間件前面的注釋。Lumen及Laravel框架創(chuàng)建的所有簽名cookies通過(guò)一個(gè)認(rèn)證碼進(jìn)行加密和簽名,這樣如果客戶端試圖篡改cookies則該cookies將會(huì)失效。

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

我們使用Illuminate\Http\Request實(shí)例的cookie方法從請(qǐng)求中獲取cookie的值:

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

新增Cookie到響應(yīng)

Lumen提供了一個(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 文件上傳

獲取上傳的文件

可以使用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');

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

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

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

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

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

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

保存上傳的文件

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

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

其它文件方法

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

通過(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ù)置于其它依賴之后即可,例如,如果你的路由定義如下:

$app->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)
    { 
        //
    }
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)