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

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

藏色散人
藏色散人オリジナル
2019-07-04 13:30:347856ブラウズ

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框架技术文章栏目:http://www.php.cn/phpkj/thinkphp/

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。