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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 2019 年 6 月 9 日 發布 6.0中間件分為系統中間件和應用中間件,系統中間件為核心框架內置的中間件,應用中間件是在應用里面創建的中間件。 >[danger] 中間件的主要應用場景可以包括對HTTP請求的數據過濾、權限檢測、請求攔截等行為,使用中間件能夠讓控制器的定義更加簡單,很多額外的非核心業務流程的處理都可以交給中間件執行。 從中間件的使用范圍來看,可以分為全局中間件、應用中間件、控制器中間件和路由中間件。 ## 全局中間件 全局中間件是在`app\middleware.php`中定義的中間件,默認沒有啟用任何中間件,但對支持的系統中間件做了注釋,你只需要取消注釋就可以使用相應的系統中間件,默認內容如下: ``` return [ // 全局請求緩存 // 'think\middleware\CheckRequestCache', // 多語言加載 // 'think\middleware\LoadLangPack', // Session初始化 // 'think\middleware\SessionInit', // 頁面Trace調試 // 'think\middleware\TraceDebug', ]; ``` 系統的部分功能交給中間件進行統一管理,包括全局請求緩存、多語言的自動檢測和加載、`Session`初始化和頁面Trace調試,也就是說,默認安裝后的應用是不支持`Session`的,你必須全局開啟`Session`初始化中間件后`Session`才能生效。對于API應用來說,本身就不需要`Session`功能支持。 你可以在全局中間件定義文件中添加你的應用中間件,但盡可能確保系統中間件的優先執行,中間件定義需要使用完整的類名,通過命令行指令可以快速創建一個應用中間件: ``` php think make:middleware Test ``` 會自動生成一個`app\middleware\Test`中間件類,內容如下: ``` <?php namespace app\middleware; class Test { public function handle($request, \Closure $next) { } } ``` 也支持通過指定完整命名空間的方式創建中間件類 ``` php think make:middleware app\middleware\Hello ``` 我們添加一個測試輸出 ``` <?php namespace app\middleware; class Test { public function handle($request, \Closure $next) { echo 'Before Middleware<br/>'; $response = $next($request); echo 'After Middleware<br/>'; return $response; } } ``` >[danger] 中間件`handle`方法的返回值必須是一個`Response`對象。 然后在全局中間件定義中添加 ``` return [ \app\middleware\Test::class, ]; ``` 假設我們要訪問的控制器方法為 ``` <?php namespace app\controller; class Index { public function hello() { return 'Hello,ThinkPHP!<br/>'; } } ``` 訪問該操作方法的輸出為 ``` Before Middleware Hello,ThinkPHP! After Middleware ``` 你可以看出中間件的執行過程,從執行流程上可以分為前置中間件和后置中間件,當然,一個中間件可能同時有前置和后置行為,上面的Test中間件就是如此。 $next($request)之前的代碼屬于前置中間件范疇,之后的代碼則屬于后置中間件范疇。 ## 應用中間件 如果是多應用模式的話,應用中間件就是在`app\應用名\middleware.php`中定義的中間件,只會在該應用下有效,定義格式和全局中間件一致。 ## 路由中間件 路由中間件則表示僅在路由匹配之后才會執行某個中間件,在路由定義中使用`middleware`方法定義,例如: ``` Route::get('hello/:name','index/hello') ->middleware(\app\middleware\Hello::class); ``` 可以給路由分組定義中間件 ``` Route::group(function(){ Route::get('hello/:name','index/hello'); //... })->middleware(\app\middleware\Hello::class); ``` 如果要執行多個中間件,可以使用 ``` Route::group(function(){ Route::get('hello/:name','index/hello'); //... })->middleware([\app\middleware\Hello::class,\app\middleware\Check::class]); ``` 對于經常要使用的中間件,我們可以定義一個別名,在`config\middleware.php`配置文件中,設置 ``` return [ 'hello' => \app\middleware\Hello::class, 'check' => \app\middleware\Check::class, ]; ``` 路由定義可以改為: ``` Route::group(function(){ Route::get('hello/:name','index/hello'); //... })->middleware(['hello','check']); ``` 支持給一組中間件定義別名 ``` return [ 'test' => [\app\middleware\Hello::class,\app\middleware\Check::class], ]; ``` 路由定義可以改為 ``` Route::group(function(){ Route::get('hello/:name','index/hello'); //... })->middleware('test'); ``` 中間件支持傳入一個參數,中間件定義如下 ``` <?php namespace app\middleware; class Hello { public function handle($request, \Closure $next, string $name = '') { echo 'Hello'. $name . '<br/>'; return $next($request); } } ``` 可以在路由中間件的第二個參數傳入name參數 ``` Route::get('hello/:name','index/hello') ->middleware('hello', 'middleware'); ``` 除了支持參數外,你可以在中間件的handle方法中使用依賴注入。 ## 控制器中間件 控制器中間件僅當訪問某個控制器的時候生效 ``` <?php namespace app\controller; class Hello { protected $middleware = ['hello','check']; public function index() { return 'Hello,ThinkPHP!<br/>'; } } ``` 由于前面已經定義了中間件別名,所以這里直接使用別名定義,否則你必須使用完整的命名空間定義。 默認情況下,控制器中定義的中間件訪問控制器的任何操作方法都會執行,有時候并不希望所有的操作都需要執行中間件,有兩種方式來定義控制器中間件的執行過濾。 ``` <?php namespace app\controller; class Index { protected $middleware = [ 'hello' => ['only' => ['hello']], 'check' => ['except'=> ['hello']], ]; public function hello() { return 'Hello,ThinkPHP!<br/>'; } public function check() { return 'this action require check!<br/>'; } } ``` `hello`中間件僅在執行`Index`控制器的`hello`操作的時候才會執行,而`check`中間件除了`hello`方法外,都會執行,具體效果你可以實際測試下。 ## 中間件傳參 中間件和控制器之間傳參的方式有很多,一個簡單的方法是使用Request來進行傳參。 ~~~ <?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 } ~~~
                  <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>

                              哎呀哎呀视频在线观看