<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                中間件主要用于攔截或過濾應用的`HTTP`請求,并進行必要的業務處理。 >[danger] 新版部分核心功能使用中間件處理,你可以靈活關閉。包括Session功能、請求緩存和多語言功能。 ## 定義中間件 可以通過命令行指令快速生成中間件 ~~~ php think make:middleware Check ~~~ 這個指令會 `app/middleware`目錄下面生成一個`Check`中間件。 ~~~ <?php namespace app\middleware; class Check { public function handle($request, \Closure $next) { if ($request->param('name') == 'think') { return redirect('index/think'); } return $next($request); } } ~~~ 中間件的入口執行方法必須是`handle`方法,而且第一個參數是`Request`對象,第二個參數是一個閉包。 >[danger] 中間件`handle`方法的返回值必須是一個`Response`對象。 在這個中間件中我們判斷當前請求的`name`參數等于`think`的時候進行重定向處理。否則,請求將進一步傳遞到應用中。要讓請求繼續傳遞到應用程序中,只需使用 `$request` 作為參數去調用回調函數 `$next` 。 >[info] 在某些需求下,可以使用第三個參數傳入額外的參數。 ~~~ <?php namespace app\middleware; class Check { public function handle($request, \Closure $next, $name) { if ($name == 'think') { return redirect('index/think'); } return $next($request); } } ~~~ ## 結束調度 中間件支持定義請求結束前的回調機制,你只需要在中間件類中添加`end`方法。 ``` public function end(\think\Response $response) { // 回調行為 } ``` >[danger] 注意,在`end`方法里面不能有任何的響應輸出。因為回調觸發的時候請求響應輸出已經完成了。 ## 前置/后置中間件 中間件是在請求具體的操作之前還是之后執行,完全取決于中間件的定義本身。 下面是一個前置行為的中間件 ~~~ <?php namespace app\middleware; class Before { public function handle($request, \Closure $next) { // 添加中間件執行代碼 return $next($request); } } ~~~ 下面是一個后置行為的中間件 ~~~ <?php namespace app\middleware; class After { public function handle($request, \Closure $next) { $response = $next($request); // 添加中間件執行代碼 return $response; } } ~~~ 中間件方法同樣也可以支持依賴注入。 來個比較實際的例子,我們需要判斷當前瀏覽器環境是在微信或支付寶 ~~~ namespace app\middleware; /** * 訪問環境檢查,是否是微信或支付寶等 */ class InAppCheck { public function handle($request, \Closure $next) { if (preg_match('~micromessenger~i', $request->header('user-agent'))) { $request->InApp = 'WeChat'; } else if (preg_match('~alipay~i', $request->header('user-agent'))) { $request->InApp = 'Alipay'; } return $next($request); } } ~~~ 然后在你的移動版的應用里添加一個`middleware.php`文件 例如:`/path/app/mobile/middleware.php` ~~~ return [ app\middleware\InAppCheck::class, ]; ~~~ 然后在你的`controller`中可以通過`request()->InApp`獲取相關的值 ## 定義中間件別名 可以直接在應用配置目錄下的`middleware.php`中先預定義中間件(其實就是增加別名標識),例如: ~~~ return [ 'alias' => [ 'auth' => app\middleware\Auth::class, 'check' => app\middleware\Check::class, ], ]; ~~~ 可以支持使用別名定義一組中間件,例如: ~~~ return [ 'alias' => [ 'check' => [ app\middleware\Auth::class, app\middleware\Check::class, ], ], ]; ~~~ ## 注冊中間件 新版的中間件分為全局中間件、應用中間件(多應用模式下有效)、路由中間件以及控制器中間件四個組。執行順序分別為: > 全局中間件->應用中間件->路由中間件->控制器中間件 ### 全局中間件 全局中間件在`app`目錄下面`middleware.php`文件中定義,使用下面的方式: ~~~ <?php return [ \app\middleware\Auth::class, 'check', 'Hello', ]; ~~~ 中間件的注冊應該使用完整的類名,如果已經定義了中間件別名(或者分組)則可以直接使用。 全局中間件的執行順序就是定義順序。可以在定義全局中間件的時候傳入中間件參數,支持兩種方式傳入。 ~~~ <?php return [ [\app\http\middleware\Auth::class, 'admin'], 'Check', ['hello','thinkphp'], ]; ~~~ 上面的定義表示 給`Auth`中間件傳入`admin`參數,給`Hello`中間件傳入`thinkphp`參數。 ### 應用中間件 如果你使用了多應用模式,則支持應用中間件定義,你可以直接在應用目錄下面增加`middleware.php`文件,定義方式和全局中間件定義一樣,只是只會在該應用下面生效。 ### 路由中間件 最常用的中間件注冊方式是注冊路由中間件 ~~~ Route::rule('hello/:name','hello') ->middleware(\app\middleware\Auth::class); ~~~ 支持注冊多個中間件 ~~~ Route::rule('hello/:name','hello') ->middleware([\app\middleware\Auth::class, \app\middleware\Check::class]); ~~~ 然后,直接使用下面的方式注冊中間件 ~~~ Route::rule('hello/:name','hello') ->middleware('check'); ~~~ 支持對路由分組注冊中間件 ~~~ Route::group('hello', function(){ Route::rule('hello/:name','hello'); })->middleware('auth'); ~~~ 支持對某個域名注冊中間件 ~~~ Route::domain('admin', function(){ // 注冊域名下的路由規則 })->middleware('auth'); ~~~ 如果需要傳入額外參數給中間件,可以使用 ~~~ Route::rule('hello/:name','hello') ->middleware('auth', 'admin'); ~~~ 如果需要定義多個中間件,使用數組方式 ~~~ Route::rule('hello/:name','hello') ->middleware([Auth::class, 'Check']); ~~~ 可以統一傳入同一個額外參數 ~~~ Route::rule('hello/:name','hello') ->middleware(['auth', 'check'], 'admin'); ~~~ 或者分開多次調用,指定不同的參數 ~~~ Route::rule('hello/:name','hello') ->middleware('auth', 'admin') ->middleware('hello', 'thinkphp'); ~~~ 如果你希望某個路由中間件是全局執行(不管路由是否匹配),可以不需要在路由里面定義,支持直接在路由配置文件中定義,例如在`config/route.php`配置文件中添加: ``` 'middleware' => [ app\middleware\Auth::class, app\middleware\Check::class, ], ``` 這樣,所有該應用下的請求都會執行`Auth`和`Check`中間件。 ### 使用閉包定義中間件 你不一定要使用中間件類,在某些簡單的場合你可以使用閉包定義中間件,但閉包函數必須返回`Response`對象實例。 ~~~ Route::group('hello', function(){ Route::rule('hello/:name','hello'); })->middleware(function($request,\Closure $next){ if ($request->param('name') == 'think') { return redirect('index/think'); } return $next($request); }); ~~~ ### 控制器中間件 支持為控制器定義中間件,只需要在控制器中定義`middleware`屬性,例如: ~~~ <?php namespace app\controller; class Index { protected $middleware = ['auth']; public function index() { return 'index'; } public function hello() { return 'hello'; } } ~~~ 當執行`index`控制器的時候就會調用`auth`中間件,一樣支持使用完整的命名空間定義。 如果需要設置控制器中間的生效操作,可以如下定義: ~~~ <?php namespace app\controller; class Index { protected $middleware = [ 'auth' => ['except' => ['hello'] ], 'check' => ['only' => ['hello'] ], ]; public function index() { return 'index'; } public function hello() { return 'hello'; } } ~~~ ## 中間件向控制器傳參 可以通過給請求對象賦值的方式傳參給控制器(或者其它地方),例如 ~~~ <?php namespace app\middleware; class Hello { public function handle($request, \Closure $next) { $request->hello = 'ThinkPHP'; return $next($request); } } ~~~ 然后在控制器的方法里面可以直接使用 ~~~ public function index(Request $request) { return $request->hello; // ThinkPHP } ~~~ ## 執行優先級 如果對中間件的執行順序有嚴格的要求,可以定義中間件的執行優先級。在配置文件中添加 ``` return [ 'alias' => [ 'check' => [ app\middleware\Auth::class, app\middleware\Check::class, ], ], 'priority' => [ think\middleware\SessionInit::class, app\middleware\Auth::class, app\middleware\Check::class, ], ]; ``` ## 內置中間件 新版內置了幾個系統中間件,包括: 中間件類|描述 ----|---- think\middleware\AllowCrossDomain|跨域請求支持 think\middleware\CheckRequestCache|請求緩存 think\middleware\LoadLangPack|多語言加載 think\middleware\SessionInit|Session初始化 think\middleware\FormTokenCheck|表單令牌 這些內置中間件默認都沒有定義,你可以在應用的`middleware.php`文件中、路由或者控制器中定義這些中間件,如果不需要使用的話,取消定義即可。
                  <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>

                              哎呀哎呀视频在线观看