<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 中間件實現代碼 你一定聽過Laravel中間件的概念跟裝飾器模式很像.簡單來講,裝飾器模式就是在開放-關閉原則下動態的增加或者刪除某一個功能.而Laravel的中間件也差不多是這個道理: >一個請求過來,在執行請求之前,可能要進行Cookie加密,開啟回話,CSRF保護等等操作.但是每一個請求不一定都需要這些操作,而且,在執行請求之后也可能需要執行一些操作.我們需要根據請求的特性動態的增加一些操作.這些需求正好可以使用裝飾器模式解決. 但是,Laravel中的中間件在代碼實現上跟中間件 又有點區別,這里給出一段代碼.真實的模擬了Laravel中間件的工作流程. ~~~ <?php interface Middleware { public static function handle(Closure $next); } class VerfiyCsrfToekn implements Middleware { public static function handle(Closure $next) { echo '驗證csrf Token', PHP_EOL; $next(); } } class ShowErrorsFromSession implements Middleware { public static function handle(Closure $next) { echo '共享session中的Error變量', PHP_EOL; $next(); } } class StartSession implements Middleware { public static function handle(Closure $next) { echo '開啟session', PHP_EOL; $next(); echo '關閉session', PHP_EOL; } } class AddQueuedCookieToResponse implements Middleware { public static function handle(Closure $next) { $next(); echo '添加下一次請求需要的cookie', PHP_EOL; } } class EncryptCookies implements Middleware { public static function handle(Closure $next) { echo '解密cookie', PHP_EOL; $next(); echo '加密cookie', PHP_EOL; } } class CheckForMaintenacceMode implements Middleware { public static function handle(Closure $next) { echo '確定當前程序是否處于維護狀態', PHP_EOL; $next(); } } function getSlice() { return function ($stack, $pipe) { return function () use ($stack, $pipe) { return $pipe::handle($stack); }; }; } function then() { $pipe = [ 'CheckForMaintenacceMode', //確定當前程序是否處于維護狀態 前置 'EncryptCookies', //解密cookie 前置 加密cookie 后置 'AddQueuedCookieToResponse', //添加下一次請求需要的cookie 后置 'StartSession', //開啟session 前置 關閉session 后置 'ShowErrorsFromSession', //共享session中error變量 前置 'VerfiyCsrfToekn', //csrf 前置 ]; $firstSlice = function () { echo '請求向路由傳遞,返回響應', PHP_EOL; }; //數組翻轉 $pipe = array_reverse($pipe); //這一行,實現了管道和中間件的執行 $callback = array_reduce($pipe, getSlice(), $firstSlice); call_user_func($callback); } then(); ~~~ 運行代碼,輸出 >確定當前程序是否處于維護狀態 解密cookie 開啟session 共享session中的Error變量 驗證csrf Token 請求向路由傳遞,返回相應 關閉ession 添加下一次請求需要的cookie 加密cookie 這段代碼可能有點難懂,原因在于對于閉包函數(Closure),array_reduce以及call_user_fun函數,而且函數調用過程又是遞歸,可以嘗試使用xdebug來調試執行.這里只提一點,array_reduce中第二個參數是一個函數,這個函數需要兩個參數: * 第一個參數從array_reduce的第一個參數$pipe數組中獲得 * 第二個參數為上一次調用的返回值.這個例子里面返回值是一個閉包函數
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看