鍍金池/ 教程/ PHP/ HTTP 請(qǐng)求
Laravel Cashier
Eloquent ORM
HTTP 響應(yīng)
發(fā)行說(shuō)明
擴(kuò)展包開(kāi)發(fā)
HTTP 控制器
事件
擴(kuò)展框架
Contracts
開(kāi)發(fā)
配置
表單驗(yàn)證
錯(cuò)誤與日志
Hashing
貢獻(xiàn)指南
郵件
Session
遷移與數(shù)據(jù)填充
查詢(xún)構(gòu)造器
Redis
升級(jí)向?qū)?/span>
概覽
緩存
服務(wù)提供者
Envoy 任務(wù)執(zhí)行器
隊(duì)列
單元測(cè)試
服務(wù)容器
文件系統(tǒng) / 云存儲(chǔ)
認(rèn)證
請(qǐng)求的生命周期
加密
模板
視圖 (View)
Laravel Homestead
Laravel 安裝指南
介紹
Command Bus
分頁(yè)
輔助方法
應(yīng)用程序結(jié)構(gòu)
HTTP 路由
HTTP 請(qǐng)求
基本用法
本地化
HTTP 中間件
結(jié)構(gòu)生成器
Facades
Laravel Elixir

HTTP 請(qǐng)求

取得請(qǐng)求實(shí)例

通過(guò) Facade

Request facade 允許你訪問(wèn)當(dāng)前綁定容器的請(qǐng)求。例如:

$name = Request::input('name');

切記,如果你在一個(gè)命名空間中,你必須導(dǎo)入 Request facade,接著在類(lèi)的上方聲明 use Request;。

通過(guò)依賴(lài)注入

要通過(guò)依賴(lài)注入的方式取得 HTTP 請(qǐng)求的實(shí)例,你必須在控制器中的構(gòu)造函數(shù)或方法對(duì)該類(lèi)使用類(lèi)型提示。當(dāng)前請(qǐng)求的實(shí)例將會(huì)自動(dòng)由服務(wù)容器注入:

<?php namespace App\Http\Controllers;

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

class UserController extends Controller {

    /**
     * Store a new user.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $name = $request->input('name');

        //
    }

}

如果你的控制器也有從路由參數(shù)傳入的輸入數(shù)據(jù),只需要將路由參數(shù)置于其他依賴(lài)之后:

<?php namespace App\Http\Controllers;

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

class UserController extends Controller {

    /**
     * Store a new user.
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        //
    }

}

取得輸入數(shù)據(jù)

取得特定輸入數(shù)據(jù)

你可以通過(guò) Illuminate\Http\Request 的實(shí)例,經(jīng)由幾個(gè)簡(jiǎn)潔的方法取得所有的用戶(hù)輸入數(shù)據(jù)。不需要擔(dān)心發(fā)出請(qǐng)求時(shí)使用的 HTTP 請(qǐng)求,取得輸入數(shù)據(jù)的方式都是相同的。

$name = Request::input('name');

取得特定輸入數(shù)據(jù),若沒(méi)有則取得默認(rèn)值

$name = Request::input('name', 'Sally');

確認(rèn)是否有輸入數(shù)據(jù)

if (Request::has('name'))
{
    //
}

取得所有發(fā)出請(qǐng)求時(shí)傳入的輸入數(shù)據(jù)

$input = Request::all();

取得部分發(fā)出請(qǐng)求時(shí)傳入的輸入數(shù)據(jù)

$input = Request::only('username', 'password');

$input = Request::except('credit_card');

如果是「數(shù)組」形式的輸入數(shù)據(jù),可以使用「點(diǎn)」語(yǔ)法取得數(shù)組:

$input = Request::input('products.0.name');

舊輸入數(shù)據(jù)

Laravel 可以讓你保留這次的輸入數(shù)據(jù),直到下一次請(qǐng)求發(fā)送前。例如,你可能需要在表單驗(yàn)證失敗后重新填入表單值。

將輸入數(shù)據(jù)存成一次性 Session

flash 方法會(huì)將當(dāng)前的輸入數(shù)據(jù)存進(jìn) session中,所以下次用戶(hù)發(fā)出請(qǐng)求時(shí)可以使用保存的數(shù)據(jù):

Request::flash();

將部分輸入數(shù)據(jù)存成一次性 Session

Request::flashOnly('username', 'email');

Request::flashExcept('password');

快閃及重定向

你很可能常常需要在重定向至前一頁(yè),并將輸入數(shù)據(jù)存成一次性 Session。只要在重定向方法后的鏈?zhǔn)秸{(diào)用方法中傳入輸入數(shù)據(jù),就能簡(jiǎn)單地完成。

return redirect('form')->withInput();

return redirect('form')->withInput(Request::except('password'));

取得舊輸入數(shù)據(jù)

若想要取得前一次請(qǐng)求所保存的一次性 Session,你可以使用 Request 實(shí)例中的 old 方法。

$username = Request::old('username');

如果你想在 Blade 模板顯示舊輸入數(shù)據(jù),可以使用更加方便的輔助方法 old

{{ old('username') }}

Cookies

Laravel 所建立的 cookie 會(huì)加密并且加上認(rèn)證記號(hào),這代表著被用戶(hù)擅自更改的 cookie 會(huì)失效。

取得 Cookie 值

$value = Request::cookie('name');

加上新的 Cookie 到響應(yīng)

輔助方法 cookie 提供一個(gè)簡(jiǎn)易的工廠方法來(lái)產(chǎn)生新的 Symfony\Component\HttpFoundation\Cookie 實(shí)例??梢栽?Response 實(shí)例之后連接 withCookie 方法帶入 cookie 至響應(yīng):

$response = new Illuminate\Http\Response('Hello World');

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

建立永久有效的 Cookie*

雖然說(shuō)是「永遠(yuǎn)」,但真正的意思是五年。

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

上傳文件

取得上傳文件

$file = Request::file('photo');

確認(rèn)文件是否有上傳

if (Request::hasFile('photo'))
{
    //
}

file 方法返回的對(duì)象是 Symfony\Component\HttpFoundation\File\UploadedFile 的實(shí)例,UploadedFile 繼承了 PHP 的 SplFileInfo 類(lèi)并且提供了很多和文件交互的方法。

確認(rèn)上傳的文件是否有效

if (Request::file('photo')->isValid())
{
    //
}

移動(dòng)上傳的文件

Request::file('photo')->move($destinationPath);

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

其他上傳文件的方法

UploadedFile 的實(shí)例還有許多可用的方法,可以至該對(duì)象的 API 文檔了解有關(guān)這些方法的詳細(xì)信息。

其他的請(qǐng)求信息

Request 類(lèi)提供很多方法檢查 HTTP 請(qǐng)求,它繼承了 Symfony\Component\HttpFoundation\Request 類(lèi),下面是一些使用方式。

取得請(qǐng)求 URI

$uri = Request::path();

取得請(qǐng)求方法

$method = Request::method();

if (Request::isMethod('post'))
{
    //
}

確認(rèn)請(qǐng)求路徑是否符合特定格式

if (Request::is('admin/*'))
{
    //
}

取得請(qǐng)求 URL

$url = Request::url();