婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺談laravel中間件的創建思路

淺談laravel中間件的創建思路

熱門標簽:凱立德地鐵站地圖標注 溫州外呼系統招商 銀行信貸電話機器人 天津電銷外呼系統違法嗎 滄州電銷外呼系統價格 上海400客服電話怎么申請 400電話個人能不能辦理 手機外呼系統什么原理 合肥ai電銷機器人費用

Laravel 中間件提供了一種機制在不修改邏輯代碼的情況下,中斷原本程序流程,通過中間件來處理一些事件,或者擴展一些功能。比如日志中間件可以方便的記錄請求和響應日志,而不需要去更改邏輯代碼。

那么我們簡化一下軟件執行過程,現在有一個核心類kernel,下面是它的laravel代碼

#捕獲請求
$request = Illuminate\Http\Request::capture()
#處理請求
$response = $kernel->handle($request);

代碼的作用是 捕獲一個 Request ,返回一個 Response。這里面就是后續分發到具體執行邏輯的代碼段并返回結果。

那么如果想在執行這個$kernel->handle()方法之前或者之后,增加一段邏輯一般會怎么寫呢。大概如下:

$request = Illuminate\Http\Request::capture()
function midware(){
    before()#在之前執行的語句集合
    #####   
    $response = $kernel->handle($request);
    #####
    after()#在之后執行的語句集合
 
}

顯然這樣寫沒有問題,但是毫無拓展性可言,想執行什么東西都要更改這個方法,這種是不可能封裝成框架核心內容的。怎么改進呢

定義一個要執行的中間件類叫middleware,類實現兩個方法,before()和after()然后代碼如下。

#配置項中有一項配置中間件:
middleware = '';
$request = Illuminate\Http\Request::capture()
function midware(){
    middleware.before()
    #####   
    $response = $kernel->handle($request);
    #####
    middleware.after()
}

是否解決了問題呢,是解決了不用更改的問題,但是我們如果需要多個中間件怎么辦呢,最容易想到的就是:定義一個中間件數組middleware_arr,每一個middleware類都含有before和after方法,代碼如下:

配置項中有middleware_arr
middleware_arr=array();
$request = Illuminate\Http\Request::capture()
function midware(){
    foreach(middleware_arr as middleware){
       middleware.before()
    }
    #####   
    $response = $kernel->handle($request);
    #####
    foreach(middleware_arr as middleware){
        middleware.after()
    }
}

雖然有點老土,但是的確解決了問題。但是這個還存在一個問題,就是我們怎么向中間件傳遞參數的問題,那么如下可以嗎:

$request = Illuminate\Http\Request::capture()
function midware(){
    foreach(middleware_arr as middleware){
       middleware.before($request)
    }
    #####   
    $response = $kernel->handle($request);
    #####
    foreach(middleware_arr as middleware){
        middleware.after($response)
    }
}

看似是解決了問題,但是仔細分析,就會發現,這里面每次給中間件的都是最初的$request,這顯然不行,修改成如下:

$request = Illuminate\Http\Request::capture()
function midware(){
    foreach(middleware_arr as middleware){
       $request = middleware.before($request)
    }
    #####   
    $response = $kernel->handle($request);
    #####
    foreach(middleware_arr as middleware){
        $response = middleware.after($response)
    }
}

還有一個問題就是,假設有兩個中間件A和B,那么執行順序應該是怎么樣呢:

$request = Illuminate\Http\Request::capture()
$request = A.before($request);
$request = B.before($request);
$response = $kernel->handle($request);
$response = A.after();
$response = B.after();

這樣合理嗎?不太好分辨,我們假設有一個記錄請求和響應日志的中間件,這個時候,不論你把它放在什么位置,都不能完美的記錄最初請求和最終日志。難道類似情況要寫兩個類,一個記錄請求放在中間件數組第一個,一個處理響應,放在數組最后一位嗎?不如在執行后面的foreach之前把middleware_arr數組給反轉一下,這樣就符合了要求:

$request = Illuminate\Http\Request::capture()
$request = A.before($request);
$request = B.before($request);
$response = $kernel->handle($request);
$response = B.after();
$response = A.after();

但是我也開始懷疑這個老土且不靈活的方案是否有更好的解決辦法,在觀察這個執行順序的時候,發現是一個包裹樣式(洋蔥式)的。那個接下來的問題就能不能找到更靈活精美的解決方案,看上面這種結構,總感覺有點熟悉,他很像是A的函數包裹B的函數,B的函數包括了最初的執行代碼。函數內部調用函數容易,但是咱們這里每一個中間件之間是不知道對方存在的,所以要把其他中間件要執行的函數傳遞到上一級,這里就用到了閉包函數還有一個php函數array_reduce(),

array_reduce函數定義:mixed array_reduce ( array $input , callable $function [, mixed $initial = NULL ] )

?php
function  rsum ( $v ,  $w ){
    $v  +=  $w ;
    return  $v ;
}
function  rmul ( $v ,  $w ){
    $v  *=  $w ;
    return  $v ;
}
$a  = array( 1 ,  2 ,  3 ,  4 ,  5 );
$x  = array();
$b  =  array_reduce ( $a ,  "rsum" );
$c  =  array_reduce ( $a ,  "rmul" ,  10 );
?>  

輸出:

這將使 $b  的值為 15, $c  的值為 1200(= 10*1*2*3*4*5)

array_reduce() 將回調函數 function 迭代地作用到 input 數組中的每一個單元中,從而將數組簡化為單一的值。咱們是把多個函數包裹成最終調用一個函數。

#我們先假設只有一個middleware,叫log來簡化情況,這里的類應該是一個類全路徑,我這里就簡單的寫一下,要不然太長了。
$middleware_arr = ['log'];
#最終要執行的代碼先封裝成一個閉包,要不然沒有辦法傳遞到內層,如果用函數名傳遞函數的話,是沒有辦法傳遞參數的。
$default = function() use($request){
    return $kernel->handle($request);
}
$callback = array_reduce($middleware_arr,function($stack,$pipe) {
    return function() use($stack,$pipe){
        return $pipe::handle($stack);
    };
},$default);
# 這里 callback最終是 這樣一個函數:
function() use($default,$log){
    return $log::handle($default);
};
#所以每一個中間件都需要有一個方法handle方法,方法中要對傳輸的函數進行運行,類似如下,這里我類名就不大寫了
class log implements Milldeware {
    public static function handle(Closure $func){
        $func();
    }
}
#這里不難看出可以加入中間件自身邏輯如下:
class log implements Milldeware {
    public static function handle(Closure $func){
        #這里可以運行邏輯塊before()
        $func();
        #這里可以運行邏輯塊after()
    }
}

這樣在執行callback函數的時候,執行順序如下:

先運行log::haddle()方法,

執行了log::before()方法

運行default方法,執行$kernel->handle($request)

運行log::after()方法

然后模擬多個的情況如下:

$middleware_arr = ['csrf','log'];
#最終要執行的代碼先封裝成一個閉包,要不然沒有辦法傳遞到內層,如果用函數名傳遞函數的話,是沒有辦法傳遞參數的。
$default = function() use($request){
    return $kernel->handle($request);
}
$callback = array_reduce($middleware_arr,function($stack,$pipe) {
    return function() use($stack,$pipe){
        return $pipe::handle($stack);
    };
},$default);

# 這里 callback最終是 執行這樣:
$log::handle(function() use($default,$csrf){
    return $csrf::handle($default);
});

執行順序如下:

1.先運行log::haddle(包含csrf::handle閉包函數)方法,

2.執行了log::before()方法

3.運行閉包也就是運行了$csrf::handle($default)

4.執行了csrf::before()方法

5.運行default方法,執行$kernel->handle($request)

6.執行了csrf::after()方法

7.運行log::after()方法

注意這里還有一個問題就是中間件產生的結果,并沒有進行傳遞,可以通過修改共有資源的方式來達到相同的目的,并非需要真的傳值到下一個中間件。

到此這篇文件就結束了,其實其中很多關節都是我寫這篇文章的時候才想明白的。尤其是對閉包函數的運用和理解更深了,閉包函數可以延遲利用資源,比如當前不適合執行的語句,又要傳遞到后面,利用閉包可以封裝起來傳遞出去,這是傳統函數做不到的。

以上就是淺談laravel中間件的創建思路的詳細內容,更多關于laravel中間件的創建思路的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • laravel利用中間件做防非法登錄和權限控制示例
  • laravel在中間件內生成參數并且傳遞到控制器中的2種姿勢
  • 淺談Laravel中的三種中間件的作用
  • Laravel獲取當前請求的控制器和方法以及中間件的例子
  • Laravel框架控制器的middleware中間件用法分析
  • laravel利用中間件防止未登錄用戶直接訪問后臺的方法
  • Laravel 6 將新增為指定隊列任務設置中間件的功能
  • laravel框架中間件 except 和 only 的用法示例
  • Laravel5.1框架注冊中間件的三種場景詳解

標簽:白城 怒江 酒泉 七臺河 溫州 赤峰 洛陽 金華

巨人網絡通訊聲明:本文標題《淺談laravel中間件的創建思路》,本文關鍵詞  淺談,laravel,中間件,的,創建,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談laravel中間件的創建思路》相關的同類信息!
  • 本頁收集關于淺談laravel中間件的創建思路的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲第一av色| 国产欧美一区视频| 日本韩国一区二区| 不卡的av在线播放| 色呦呦日韩精品| 色呦呦国产精品| 欧美精品三级在线观看| 欧美精品1区2区3区| 欧美久久久久免费| 日韩一区二区免费高清| 日韩女优av电影| 国产视频一区二区在线| 中文字幕中文字幕一区二区| 国产精品三级av在线播放| 亚洲丝袜制服诱惑| 日韩高清一区二区| 国产一级精品在线| www.久久精品| 91精品国产综合久久精品app| 欧美精品欧美精品系列| 欧美v亚洲v综合ⅴ国产v| 欧美高清在线视频| 亚洲一区在线看| 久久9热精品视频| 97精品视频在线观看自产线路二| 欧美在线free| 精品国产伦一区二区三区免费| 国产亚洲一二三区| 亚洲午夜精品久久久久久久久| 日韩精品国产精品| 94-欧美-setu| 日韩午夜激情免费电影| 成人免费在线播放视频| 亚洲h精品动漫在线观看| 久久国产乱子精品免费女| 风间由美一区二区av101| 色婷婷av一区二区三区软件| 日韩精品专区在线影院重磅| 中文字幕在线免费不卡| 毛片av中文字幕一区二区| 99久久精品久久久久久清纯| 欧美一区午夜精品| 亚洲欧美激情插 | 欧美精品日日鲁夜夜添| 国产欧美日韩在线观看| 首页欧美精品中文字幕| www.成人网.com| 久久综合色鬼综合色| 亚洲成人免费电影| 91丨九色丨蝌蚪富婆spa| 久久午夜免费电影| 日本中文字幕不卡| 91久久一区二区| 中文字幕一区二区三区四区不卡| 久久国产精品99精品国产| 欧洲另类一二三四区| 一区二区中文视频| 成人免费av网站| 国产亚洲1区2区3区| 国内精品伊人久久久久av一坑| 欧美日韩在线播| 一区二区在线电影| 92国产精品观看| 国产精品第四页| kk眼镜猥琐国模调教系列一区二区 | 欧洲精品一区二区| 亚洲日韩欧美一区二区在线| 国产精品99久久久久久似苏梦涵| 日韩三区在线观看| 久久99久久久久| 欧美成人官网二区| 激情欧美日韩一区二区| 日韩美女在线视频| 国产一区日韩二区欧美三区| 26uuu亚洲| 国产精品一二一区| 国产精品伦理在线| 一本色道亚洲精品aⅴ| 亚洲精品一卡二卡| 色婷婷激情一区二区三区| 亚洲综合色区另类av| 欧美日韩亚洲综合在线| 蜜桃传媒麻豆第一区在线观看| 欧美一区二区三区播放老司机| 视频一区二区三区在线| 欧美大片一区二区三区| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 亚洲另类在线制服丝袜| 在线精品观看国产| 日本vs亚洲vs韩国一区三区二区 | 亚洲欧美一区二区视频| 欧洲视频一区二区| 蜜臀久久99精品久久久久久9| 日韩欧美在线123| 粉嫩绯色av一区二区在线观看| 中文字幕中文字幕在线一区| 欧美日韩亚洲不卡| 黄页网站大全一区二区| 国产精品美女久久久久久2018| 欧洲亚洲精品在线| 国产一区二区三区综合| 夜夜精品视频一区二区 | 国产一区高清在线| 亚洲欧美影音先锋| 日韩一区二区在线观看视频 | 国内精品伊人久久久久av影院 | 日韩激情一区二区| 欧美极品美女视频| 欧美日韩一区二区在线视频| 精品无人区卡一卡二卡三乱码免费卡| 国产女人18毛片水真多成人如厕| av在线不卡免费看| 免费欧美在线视频| 亚洲男人的天堂网| 国产欧美一区在线| 日韩一级成人av| 色偷偷88欧美精品久久久| 久久精品久久久精品美女| 最好看的中文字幕久久| 精品国产露脸精彩对白| 欧美性大战久久| 成av人片一区二区| 国产一区二区三区日韩| 亚洲成a人片在线观看中文| 久久一区二区视频| 欧美一级片免费看| 欧美日韩视频专区在线播放| 成人午夜视频福利| 极品瑜伽女神91| 日韩av一区二区三区四区| 国产精品久久久久aaaa樱花| 久久久综合视频| 日韩欧美卡一卡二| 欧美丰满少妇xxxxx高潮对白| 91免费看片在线观看| 成人app软件下载大全免费| 国产在线播精品第三| 蜜桃在线一区二区三区| 午夜影院在线观看欧美| 亚洲成a人在线观看| 亚洲成人资源网| 亚洲一区精品在线| 一区二区三区四区在线播放| 亚洲老司机在线| 亚洲欧美另类图片小说| 亚洲欧美日韩久久| 最新国产精品久久精品| 亚洲免费视频中文字幕| 亚洲欧美日韩电影| 亚洲综合色视频| 午夜久久电影网| 免费在线看成人av| 裸体歌舞表演一区二区| 黄色日韩网站视频| 国产美女视频91| 国产激情一区二区三区| 成人动漫一区二区在线| 99久久精品99国产精品 | 欧美精品一区二区三区蜜臀| 精品国产一区二区三区久久影院 | 69成人精品免费视频| 日韩美一区二区三区| 久久久久久久综合狠狠综合| 欧美激情中文不卡| 亚洲人精品午夜| 亚洲va欧美va人人爽| 奇米888四色在线精品| 国产一区二区三区| 99vv1com这只有精品| 欧美日韩国产另类不卡| 日韩欧美中文字幕精品| 国产日韩亚洲欧美综合| 国产精品乱子久久久久| 手机精品视频在线观看| 六月丁香综合在线视频| 本田岬高潮一区二区三区| 欧美在线视频你懂得| 久久综合久久综合亚洲| 亚洲人成在线播放网站岛国| 日韩激情视频在线观看| www.在线欧美| 欧美一区二区视频网站| 国产精品视频免费| 视频一区二区国产| 不卡大黄网站免费看| 在线播放视频一区| 国产精品毛片a∨一区二区三区 | 国产东北露脸精品视频| 欧美亚一区二区| 久久久蜜臀国产一区二区| 一区二区三区日韩精品| 国产美女精品在线| 欧美日韩一区视频| 中文字幕一区二区日韩精品绯色 | 国产精品免费久久久久| 亚洲超丰满肉感bbw| 不卡欧美aaaaa| 国产日韩欧美在线一区| 日本成人在线看| 在线视频国产一区|