本篇文章給你們帶來的內容是關於laravel框架的中間件middleware的詳解,有必定的參考價值,有須要的朋友能夠參考一下,但願對你有所幫助。php
laravel中間件是個很是方便的東西,能將一些邏輯實現解耦,而且在laravel中,
中間件的編寫也是很是的方便。誰用誰知道。laravel
1.裝飾器模式編程
laravel中的中間件使用的就是裝飾器模式,什麼是[裝飾器模式][1],先去了解一下吧,這裏大概說一下,就是這個模式主要的就是用於解決 當一個類須要動態擴展功能的時候,使用繼承的方式會讓子類膨脹,而且這個擴展的功能是個公用功能的狀況下,不利於功能的複用以及代碼的解耦。數組
在laravel,使用對於使用這種模式的功能,稱爲請求處理管道,也就是pipeline閉包
1app 2框架 3模塊化 4函數 5ui 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
輸出:
這個就是一個簡單的基於裝飾器模式的管道。他的本質其實就是基於閉包和遞歸。
經過分析這個程序,對於最終生成的$a變量,它的值大概是這樣的 MiddleStepOne.handle(MiddleStepTwo.handle(first)),當執行的時候由於在handle中有個next()函數的存在,因此這是一個遞歸的調用。對於laravel的中間件,他的實現原理也是和這個同樣的。
2.laravel中的中間件和請求處理管道
在laravel中,咱們咱們能夠經過設置中間件來在請求執行以前作一些預先的處理。
從請求入口 public/index.php開始
重要的是這段代碼:即 處理請求,返回請求的響應
1 2 3 |
|
接着咱們進入kernel中看他的具體實現 IlluminateFoundationHttpKernel.php中
關於dispatchToRouter()函數請你們本身去看,這裏就很少說了。
接下來就是激動人心的PipeLine類了,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
|
總的來講pipeLine類的實現和我以前寫的修飾器是差很少,這裏主要麻煩的地方就在於就在於
protected function carry()函數內部,對於當pip是閉包,字符串,還有對象的處理。
以前以爲laravel的中間件是個很神祕的東西,可是看了以後才以爲也就那樣,很精巧,在實際開發中這種模式也是頗有幫助的,例如咱們目前用的一個gateway項目,由於沒有使用任何框架,因此將判斷條件剝離,寫入到中間件中, 這樣實現了必定程度上的模塊化編程。