iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 23
0
Modern Web

PHP laravel的邂逅系列 第 23

DAY23-laravel Middleware 介紹

  • 分享至 

  • xImage
  •  

DAY23-laravel middleware介紹

HTTP 中介層提供一個方便的機制來過濾進入應用程式的 HTTP 請求。
middleware中文稱為中介,中介層就像是個管理員一樣,要進入route之前,可以設定驗證使用者權限或是其他任務,成功驗證才能進入route,如果沒有中介層,就必須在每隻route裡面都需要寫入一樣的驗證程式碼或是其他任務,有了中介就可以省去很多麻煩。
Laravel 框架已經內建一些中介層,包括維護、身份驗證、CSRF 保護,等等。所有的中介層都放在 app/Http/Middleware 目錄內。

定義中介層

下面指令可以新增一個新的中介層

php artisan make:middleware OldMiddleware

執行完指令後會在 app/Http/Middleware 目錄內建立一個名稱為 OldMiddleware 的類別。

中介層執行時機

無論中介層會在請求前執行還是會在請求後才執行,這都取決於中介層本身。下面有兩個分別是請求前執行或是請求後執行。

<?php

namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // 執行動作

        return $next($request);
    }
}
<?php

namespace App\Http\Middleware;

use Closure;

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // 執行動作

        return $response;
    }
}

註冊中介層

若是希望每個 HTTP 請求都經過一個中介層,只要將中介層的類別加入到 app/Http/Kernel.php 的 $middleware 屬性清單列表中。

如果你要指派中介層給特定的路由,必須先在app/Http/Kernel.php 幫中介層設定一個名稱。
預設情況下,這個檔案內的 $routeMiddleware 屬性已包含了 Laravel 目前設定的中介層,你只需要在清單列表中加上一組自訂的鍵即可。

// 在 App\Http\Kernel 類別內...

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

中介層群組

有時你可能想將多個中介層組成單一的鍵,讓它可以簡單的指派給路由。可以在$middlewareGroups中設定。

Laravel 內建了 web 及 api 中介層群組,包含了你想套用在 web UI 與 API 路由常用的中介層:

/**
 * 應用程式的路由中介層群組。
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

    'api' => [
        'throttle:60,1',
        'auth:api',
    ],
];

中介層群組可以使用與單一中介層一樣的語法指派給路由及控制器行為。同樣的,中介層群組只是讓一次指派多個中介層置路由更方便:

Route::group(['middleware' => ['web']], function () {
    //
});

上一篇
DAY22-laravel session介紹
下一篇
DAY24-laravel post application PART 1
系列文
PHP laravel的邂逅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言