iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
自我挑戰組

學框架永不嫌晚,從現在開始學Laravel你也可以系列 第 6

Day 6 Laravel基礎功 - MiddleWare中介層

  • 分享至 

  • xImage
  •  

HTTP 中介層提供一個方便的機制來過濾進入應用程式的 HTTP 請求。例如,Laravel 本身使用中介層來檢驗使用者身份驗證。如果使用者未經過身份驗證,中介層會將用戶導向登入頁面,反之,當用戶通過身份驗證,中介層將會同意此請求繼續往前進。

當然,除了身份驗證之外,中介層也可以被用來執行各式各樣的任務,CORS 中介層負責替所有即將離開程式的回應加入適當的標頭。而日誌中介層可以記錄所有傳入應用程式的請求。

Laravel 框架已經內建一些中介層,包括維護、身份驗證、CSRF 保護,等等。所有的中介層都放在 app/Http/Middleware 目錄內。

以上為官方的中文內容

會有人好奇如果是這樣Controllers和Middleware 某方面不是一樣,都是在送至頁面前針對所攜帶的資料進行加工。
的確,實際上兩者所做的事情是一樣的,差別在於Controllers進行的是從請求到產生回應這當中每階段要做的事情
Middleware執行的是僅僅是其中的一部份,文件提到的範例 維護、身份驗證、CSRF 保護等,至於要如何使用要設計得看團隊的規範。

簡單的中介層範例

用artisan來產出我們新建立的Middleware

php artisan make:middleware OldMiddleware

    <?php

        namespace App\Http\Middleware;

        use Closure;

        class OldMiddleware
        {

            public function handle($request, Closure $next)
            {
                if ($request->input('age') <= 200) {
                    return redirect('home');
                }

                return $next($request);
            }

            //傳給客戶端之後再執行
            public function terminate($request, $response)
            {
                // 儲存 session 資料...
            }

        }
    ?>

Middleware可以在回應前請求前或回應後執行

  <?php 

    namespace App\Http\Middleware;

    use Closure;

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

            return $next($request);
        }
    }

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

            // 執行動作

            return $response;
        }
    }

  ?>

全域中介層,可以將middleware寫在kernel內,就可以利用middleware方法來呼叫

    <?php 

      // 在 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,
      ];


    ?>

如何使用

    <?php 

      Route::get('admin/profile', ['middleware' => 'auth', function () {
          //
      }]);


      Route::get('/', ['middleware' => ['first', 'second'], function () {
          //
      }]);

    ?>

上一篇
Day 5 Laravel基礎功 - 控制器Controller
下一篇
Day 7 Laravel基礎功 - Migrations
系列文
學框架永不嫌晚,從現在開始學Laravel你也可以14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言