ホームページ > PHPフレームワーク > ThinkPHP > thinkphpミドルウェアとは何ですか

thinkphpミドルウェアとは何ですか

藏色散人
リリース: 2019-07-04 13:30:59
オリジナル
7848 人が閲覧しました

ThinkPHP は、エンタープライズ レベルのアプリケーション開発とアジャイルな WEB アプリケーション開発を簡素化するために生まれました。これは 2006 年初頭に初めて誕生し、2007 年の元旦に正式に ThinkPHP に名前変更され、Apache2 オープンソース契約に基づいてリリースされました。 ThinkPHP は誕生以来、シンプルで実用的な設計原則を堅持しており、優れたパフォーマンスと最小限のコードを維持しながら、使いやすさにも重点を置いています。また、多くの独自の機能を備えており、コミュニティ チームの積極的な参加により、使いやすさ、拡張性、パフォーマンスの点で継続的に最適化および改善されています。

thinkphpミドルウェアとは何ですか

# thinkphp ミドルウェアとは何ですか?

バージョン 5.1.6 から、ミドルウェア サポートが正式に導入されます。

ミドルウェアは主に、アプリケーションの HTTP リクエストをインターセプトまたはフィルタリングし、必要なビジネス処理を実行するために使用されます。

ミドルウェアの定義

コマンド ライン命令を使用してミドルウェアをすばやく生成できます

php think make:middleware Check
ログイン後にコピー

この命令では、application/http/middleware ディレクトリの下にチェックが生成されますミドルウェア。

<?php
namespace app\http\middleware;
class Check
{
    public function handle($request, \Closure $next)
    {
        if ($request->param(&#39;name&#39;) == &#39;think&#39;) {
            return redirect(&#39;index/think&#39;);
        }
        return $next($request);
    }
}
ログイン後にコピー

ミドルウェアのエントリ実行メソッドはハンドルメソッドである必要があり、最初のパラメータはRequestオブジェクト、2番目のパラメータはクロージャです。

ミドルウェア ハンドル メソッドの戻り値は、Response オブジェクトである必要があります。

本ミドルウェアでは、現在のリクエストのnameパラメータがthinkと等しいと判断した場合にリダイレクト処理を行います。それ以外の場合、リクエストはさらにアプリケーションに渡されます。引き続きリクエストをアプリケーションに渡すには、$request を引数としてコールバック関数 $next を呼び出すだけです。

特定の要件では、3 番目のパラメーターを使用して追加のパラメーターを渡すことができます。

<?php
namespace app\http\middleware;
class Check
{
    public function handle($request, \Closure $next, $name)
    {
        if ($name == &#39;think&#39;) {
            return redirect(&#39;index/think&#39;);
        }
        return $next($request);
    }
}
ログイン後にコピー

ミドルウェアの事前/事後

ミドルウェアが特定の操作が要求される前に実行されるか、要求された後に実行されるかは、ミドルウェア自体の定義に完全に依存します。

次はプレビヘイビア用のミドルウェアです

<?php
namespace app\http\middleware;
class Before
{
    public function handle($request, \Closure $next)
    {
        // 添加中间件执行代码
        return $next($request);
    }
}
ログイン後にコピー

次はポストビヘイビア用のミドルウェアです

<?php
namespace app\http\middleware;
class After
{
    public function handle($request, \Closure $next)
    {
$response = $next($request);
        // 添加中间件执行代码
        return $response;
    }
}
ログイン後にコピー

より実践的な例を見てみましょう。現在の閲覧サーバー環境は WeChat または Alipay

namespace app\http\middleware;
/**
 * 访问环境检查,是否是微信或支付宝等
 */
class InAppCheck
{
    public function handle($request, \Closure $next)
    {
        if (preg_match(&#39;~micromessenger~i&#39;, $request->header(&#39;user-agent&#39;))) {
            $request->InApp = &#39;WeChat&#39;;
        } else if (preg_match(&#39;~alipay~i&#39;, $request->header(&#39;user-agent&#39;))) {
            $request->InApp = &#39;Alipay&#39;;
        }
        return $next($request);
    }
}
ログイン後にコピー

次に、モバイル版モジュールに middleware.php ファイルを追加します

例: /path/application/mobile/middleware.php

return [
    app\http\middleware\InAppCheck::class,
];
ログイン後にコピー

その後、コントローラーで $this->request->InApp

ミドルウェアの登録

ルーティング ミドルウェアを通じて関連する値を取得できます。

最も一般的に使用されるミドルウェア登録方法は、ルーティング ミドルウェアを登録することです

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware(&#39;Auth&#39;);
ログイン後にコピー

または完全なミドルウェア クラス名を使用します

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware(app\http\middleware\Auth::class);
ログイン後にコピー

複数の登録をサポートしますミドルウェア

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware([&#39;Auth&#39;, &#39;Check&#39;]);
ログイン後にコピー

V5.1.7 バージョンでは、アプリケーション構成ディレクトリの middleware.php でミドルウェアを直接事前定義できます (実際にはエイリアス識別子を追加します)。例:

return [
&#39;auth&#39;=>app\http\middleware\Auth::class,
    &#39;check&#39;=>app\http\middleware\Check::class
];
ログイン後にコピー

次に、ルーティング # でミドルウェア エイリアスを使用して直接登録します。 ##

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware([&#39;auth&#39;, &#39;check&#39;]);
ログイン後にコピー

V5.1.8 以降、エイリアスを使用して一連のミドルウェアを定義できます。例:

return [
&#39;check&#39;=>[
    app\http\middleware\Auth::class,
   app\http\middleware\Check::class
    ],
];
ログイン後にコピー

次に、次のメソッドを直接使用してミドルウェア ファイル

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware(&#39;check&#39;);
ログイン後にコピー
# を登録します。 ##ルーティング グループのミドルウェアの登録をサポート

Route::group(&#39;hello&#39;, function(){
Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;);
})->middleware(&#39;Auth&#39;);
ログイン後にコピー

V5.1.8 バージョンでは、特定のドメイン名に対するミドルウェアの登録のサポートが開始されました

Route::domain(&#39;admin&#39;, function(){
// 注册域名下的路由规则
})->middleware(&#39;Auth&#39;);
ログイン後にコピー

追加のパラメーターをミドルウェア ファイルの場合は、

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware(&#39;Auth:admin&#39;);
ログイン後にコピー

を使用できます。定数定義を使用する場合は、2 番目のパラメータでミドルウェア パラメータを渡すことができます。

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware(Auth::class, &#39;admin&#39;);
ログイン後にコピー

複数のミドルウェアを定義する必要がある場合は、配列メソッド

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware([Auth::class, &#39;Check&#39;]);
ログイン後にコピー

を使用して、同じ追加パラメータ

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware([Auth::class, &#39;Check&#39;], &#39;admin&#39;);
ログイン後にコピー

を渡すことも、ミドルウェア パラメータを個別に指定することもできます。

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware([&#39;Auth:admin&#39;, &#39;Check:editor&#39;]);
ログイン後にコピー

クロージャを使用してミドルウェアを定義する

ミドルウェア クラスを使用する必要はありません。単純な状況では、クロージャを使用してミドルウェアを定義できますが、クロージャは関数は Response オブジェクトのインスタンスを返す必要があります。

Route::group(&#39;hello&#39;, function(){
Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;);
})->middleware(function($request,\Closure $next){
    if ($request->param(&#39;name&#39;) == &#39;think&#39;) {
        return redirect(&#39;index/think&#39;);
    }
    
return $next($request);
});
ログイン後にコピー

グローバル ミドルウェア

アプリケーション ディレクトリの下に middleware.php ファイルを定義し、次の方法を使用できます。

<?php
return [
\app\http\middleware\Auth::class,
    &#39;Check&#39;,
    &#39;Hello&#39;,
];
ログイン後にコピー

ミドルウェアの登録完全なクラス名を使用するか、名前空間が指定されていない場合は app\http\middleware を名前空間として使用する必要があります。

グローバルミドルウェアの実行順序は定義順となります。グローバル ミドルウェアを定義するときにミドルウェア パラメーターを渡すことができ、2 つの方法がサポートされています。

<?php
return [
[\app\http\middleware\Auth::class, &#39;admin&#39;],
    &#39;Check&#39;,
    &#39;Hello:thinkphp&#39;,
];
ログイン後にコピー

上記の定義は、admin パラメーターが Auth ミドルウェアに渡され、thinkphp パラメーターが Hello ミドルウェアに渡されることを意味します。

モジュールミドルウェア

バージョン V5.1.8 からモジュールミドルウェアの定義がサポートされ、モジュールディレクトリ直下に middleware.php ファイルを追加し、定義メソッドとミドルウェア定義は同じですが、このモジュールでのみ有効になります。

コントローラ ミドルウェア

V5.1.17 以降、コントローラのミドルウェアの定義がサポートされています。まず、コントローラーはシステムの think\Controller クラスを継承し、次にコントローラーでミドルウェア属性を定義する必要があります (例:

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    protected $middleware = [&#39;Auth&#39;];
    public function index()
    {
        return &#39;index&#39;;
    }
    public function hello()
    {
        return &#39;hello&#39;;
    }
}
ログイン後にコピー

) インデックス コントローラーが実行されると、Auth ミドルウェアが呼び出されます。完全な名前空間定義の使用をサポートします。

コントローラーの途中で効​​果的な操作を設定する必要がある場合は、次のように定義できます:

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    protected $middleware = [ 
    &#39;Auth&#39; => [&#39;except&#39; => [&#39;hello&#39;] ],
        &#39;Hello&#39; => [&#39;only&#39; => [&#39;hello&#39;] ],
    ];
    public function index()
    {
        return &#39;index&#39;;
    }
    public function hello()
    {
        return &#39;hello&#39;;
    }
}
ログイン後にコピー

ミドルウェアはパラメーターをコントローラーに渡します

<?php
namespace app\http\middleware;
class Hello
{
    public function handle($request, \Closure $next)
    {
        $request->hello = &#39;ThinkPHP&#39;;
        
        return $next($request);
    }
}
ログイン後にコピー

などのオブジェクト割り当てによって、要求 Pass パラメータをコントローラ (または他の場所) に渡すことができます。渡される変数名は param 変数と競合しないことに注意してください。

そうすれば、コントローラー メソッドで直接使用できます

public function index(Request $request)
{
return $request->hello; // ThinkPHP
}
ログイン後にコピー

本文来自ThinkPHP框架技术文章栏目://m.sbmmt.com/phpkj/thinkphp/

以上がthinkphpミドルウェアとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート