Laravel入坑指南(7)——中間件Middleware


Laravel框架中引入了“中間件”這個概念,筆者覺得不是太合適。這里的Middleware和Java Servlet中的過濾器(Filter)就是一個東西,但是想比之下Filter這個詞更容易理解一些。當然,為了入鄉隨俗,我們在這里也稱這東西為“中間件”。

中間件的作用其實很簡單,很明了:在業務行為之前先做點事情(前中間件)-->執行業務行為-->再做點其它事件(后中間件)。讓我們來張靈魂畫圖:

所以,我們現在需要解決下面兩個問題:創建和配置。

1、中間件的創建

在項目根目錄下,執行php artisan make:middleware TestMidWare,就可以在/app/Http/Middleware下就自動生成了一個TestMidWare.php文件,里面有個TestMidWare類,原始代碼如下:

 

2、中間件的使用

既然現在中間件類已經創建出來了,我們就開始討論怎么讓這個類生效。注冊中間件,讓中間件起作用,我們在這里討論兩種很常見的方式:全局中間件 和 路由中間件。

無論是哪一種中間件,都要在/app/Http/Kernel.php中注冊,才可以生效。

(1) 全局中間件

 Kernel.php文件中有一個名為$middleware的數組,只要將我們的中間件類(例上上面的TestMidWare)寫在這個數組中,就會對所有的業務流程生效,如下圖:

 

 (2)路由中間件

在Kernel.php文件中有一個名為$routeMiddleware的數組,將中間件類寫在這個數組中(要以key=>value的形式),並且在路由中指定,就可以生效,如下圖:

 

 接着,我們在路由中指定這個中間件:

 

這時當我們訪問http://域名/hello/id的時候,在MyController@hello的業務生效前后,CrossDomain中間件就會起作用。 

 

3、前/后中間件

無論是前中間件還是后中間件,本質都是中間件,創建和注冊的方法都完全一樣。只是代碼在中間件類里的位置不一樣而已。一個中間件可以同時是前中間件和后中間件。代碼如下所示:

namespace App\Http\Middleware;

use Closure;

class TestMidWare
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        //A    前中間件代碼
        $response=$next($request);    //業務流程,流轉到下一個中間件,或者業務處理函數
        //B    后中間件代碼
        
        return $response;
    }
}

代碼寫在A部分,這個中間件就是前中間件;代碼寫在B部分,這個中間件就是后中間件;如果A和B兩個部分都寫,那么這個中間件既是前中間件,也是后中間件。

 

4、其他

到了這里,中間件的使用方法就告一段落了。下面舉個中間件使用的例子,我的代碼需要實現跨域,所有的API響應之前都要輸出跨域的header,所以我選用了中間件來處理:

<?php

namespace App\Http\Middleware;

use Closure;

class CrossDomain
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response=$next($request);

        $response->header('Access-Control-Allow-Origin', "*");
        $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN');
        $response->header('Access-Control-Expose-Headers', 'Authorization, authenticated');
        $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
        $response->header('Access-Control-Allow-Credentials', 'true');

        return $response;
    }
}

 

中間件的話題到這里結束,上面是最最常用的中間件知識點。當然,中間件還有其他的話題:中間件組、終端中間件、中間件參數,這些大家就參考官方手冊吧。

下回見咯:)

 

 

---------------------------  我是可愛的分割線  ----------------------------

最后博主借地宣傳一下,漳州編程小組招新了,這是一個面向漳州青少年信息學/軟件設計的學習小組,有意向的同學點擊鏈接,聯系我吧。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM