ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP6.0のミドルウェアを1つの記事で学ぶ

ThinkPHP6.0のミドルウェアを1つの記事で学ぶ

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼転載
2019-12-16 13:22:207509ブラウズ

ThinkPHP6.0のミドルウェアを1つの記事で学ぶ

ThinkPHP6.0 ミドルウェアはシステムミドルウェアとアプリケーションミドルウェアに分かれており、システムミドルウェアはコアフレームワークに組み込まれるミドルウェア、アプリケーションミドルウェアはアプリケーション内に作成されるミドルウェアです。

ミドルウェアの主なアプリケーション シナリオには、データ フィルタリング、権限の検出、リクエストのインターセプト、および HTTP リクエストのその他の動作が含まれます。ミドルウェアを使用すると、コントローラの定義が簡素化され、多くの追加の非コア ビジネス プロセスを処理できます。すべて実行のためにミドルウェアに渡すことができます。

ミドルウェアの利用範囲の観点から、グローバルミドルウェア、アプリケーションミドルウェア、コントローラミドルウェア、ルーティングミドルウェアに分類できます。

グローバル ミドルウェア

グローバル ミドルウェアは、app\middleware.php で定義されたミドルウェアです。デフォルトでは有効なミドルウェアはありませんが、サポートされているシステム ミドルウェアについては、ファイルがコメント化されています。対応するシステム ミドルウェアを使用するには、コメントを解除するだけで済みます。デフォルトの内容は次のとおりです:

return [
    // 全局请求缓存
    // 'think\middleware\CheckRequestCache',
    // 多语言加载
    // 'think\middleware\LoadLangPack',
    // Session初始化
    // 'think\middleware\SessionInit',
    // 页面Trace调试
    // 'think\middleware\TraceDebug',
];

システムの一部の機能は、グローバル リクエスト キャッシュ、多言語自動など、一元管理のためにミドルウェアに引き継がれます。検出と読み込み、セッションの初期化とページ トレースのデバッグ、つまり、デフォルトでインストールされるアプリケーションはセッションをサポートしていません。セッションを有効にする前に、セッション初期化ミドルウェアをグローバルに有効にする必要があります。 API アプリケーションの場合、セッション関数のサポートは必要ありません。

グローバル ミドルウェア定義ファイルにアプリケーション ミドルウェアを追加できますが、システム ミドルウェアが最初に実行されるようにしてください。ミドルウェア定義では完全なクラス名を使用する必要があり、これはコマンド ラインですぐに作成できます。アプリケーション ミドルウェア:

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 &#39;Before Middleware<br/>&#39;;
    $response = $next($request);
    echo &#39;After Middleware<br/>&#39;;
    return $response;
    }
}

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

次に、グローバル ミドルウェア定義に

return [
\app\middleware\Test::class,
];

を追加します。アクセスしたいコントローラー メソッドが

<?php
namespace app\controller;
class Index
{
    public function hello()
    {
    return &#39;Hello,ThinkPHP!<br/>&#39;;
    }
}

であるとします。操作メソッドへのアクセスの出力は

Before Middleware
Hello,ThinkPHP!
After Middleware
# です。 # #ミドルウェアの実行プロセスがわかります。実行プロセスからプレミドルウェアとポストミドルウェアに分けることができます。もちろん、ミドルウェアにはプレミドルウェアとポストミドルウェアの両方の動作がある場合があります。これは、上記のテストミドルウェアです。 $next($request) より前のコードはプレミドルウェア カテゴリに属し、その後のコードはポストミドルウェア カテゴリに属します。

アプリケーション ミドルウェア

マルチアプリケーション モードの場合、アプリケーション ミドルウェアは app\アプリケーション名\middleware.php に定義されているミドルウェアであり、これのみが使用されます。 in 本アプリケーション上で有効であり、定義形式はグローバルミドルウェアと一致します。

ルーティング ミドルウェア

ルーティング ミドルウェアとは、ルートが一致した場合にのみ特定のミドルウェアが実行されることを意味します。これは、ルート定義のミドルウェア メソッドを使用して定義されます。例:

Route::get(&#39;hello/:name&#39;,&#39;index/hello&#39;)
    ->middleware(\app\middleware\Hello::class);

ルーティング グループ用のミドルウェアを定義できます

Route::group(function(){
Route::get(&#39;hello/:name&#39;,&#39;index/hello&#39;);
//...
})->middleware(\app\middleware\Hello::class);

複数のミドルウェアを実行したい場合は、

Route::group(function(){
Route::get(&#39;hello/:name&#39;,&#39;index/hello&#39;);
//...
})->middleware([\app\middleware\Hello::class,\app\middleware\Check::class]);

を使用できます頻繁に使用されるミドルウェアについては、1 つのミドルウェアを定義できますconfig\middleware.php 構成ファイルでエイリアスを設定します。

return [
&#39;hello&#39;=>\app\middleware\Hello::class,
&#39;check&#39;=>\app\middleware\Check::class,
];

ルート定義は次のように変更できます:

Route::group(function(){
Route::get(&#39;hello/:name&#39;,&#39;index/hello&#39;);
//...
})->middleware([&#39;hello&#39;,&#39;check&#39;]);

サポート ミドルウェアのグループのエイリアスの定義

return [
&#39;test&#39;=>[\app\middleware\Hello::class,\app\middleware\Check::class],
];

ルート定義

Route::group(function(){
Route::get(&#39;hello/:name&#39;,&#39;index/hello&#39;);
//...
})->middleware(&#39;test&#39;);

に変更できます。ミドルウェアはパラメータの受け渡しをサポートしています。ミドルウェアは次のように定義されています:

<?php
namespace app\middleware;
class Hello
{
    public function handle($request, \Closure $next, string $name = &#39;&#39;)
    {
    echo &#39;Hello&#39;. $name . &#39;<br/>&#39;;
    return $next($request);
    }
}

nameパラメータはルーティングの2番目のパラメータとして渡すことができますmiddleware

Route::get(&#39;hello/:name&#39;,&#39;index/hello&#39;)
    ->middleware(&#39;hello&#39;, &#39;middleware&#39;);

パラメータのサポートに加えて、ミドルウェアのハンドル メソッドで依存関係の挿入を使用できます。

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

コントローラミドルウェアは、特定のコントローラにアクセスした場合にのみ有効になります

<?php
namespace app\controller;
class Hello
{
protected $middleware = [&#39;hello&#39;,&#39;check&#39;];
    public function index()
    {
    return &#39;Hello,ThinkPHP!<br/>&#39;;
    }
}

ミドルウェアは事前にエイリアスが定義されているため、エイリアスを使用しますここで直接定義を使用するか、完全な名前空間定義を使用する必要があります。

デフォルトでは、コントローラーに定義されたミドルウェアがコントローラーにアクセスするすべての操作メソッドが実行されます。すべての操作でミドルウェアを実行する必要がない場合があります。コントローラーのミドルウェアを定義する方法は 2 つあります。 . ファイルの実行フィルタリング。

<?php
namespace app\controller;
class Index
{
protected $middleware = [
&#39;hello&#39; => [&#39;only&#39;  => [&#39;hello&#39;]],
&#39;check&#39; => [&#39;except&#39;=> [&#39;hello&#39;]],
];
    public function hello()
    {
    return &#39;Hello,ThinkPHP!<br/>&#39;;
    }
    public function check()
    {
    return &#39;this action require check!<br/>&#39;;
    }    
}

helloミドルウェアはIndexコントローラのhelloオペレーション実行時のみ実行され、チェックミドルウェアはhelloメソッド以外で実行され、具体的な効果を実際にテストすることができます。

ミドルウェアによるパラメータの受け渡し

ミドルウェアとコントローラ間でパラメータを渡す方法は多数ありますが、簡単な方法は、Request を使用してパラメータを渡すことです。

<?php
namespace app\middleware;
class Hello
{
    public function handle($request, \Closure $next)
    {
        $request->hello = &#39;ThinkPHP&#39;;
        
        return $next($request);
    }
}

ミドルウェアからコントローラへのパラメータ転送はプレミドルウェアで完了する必要があり、ポストミドルウェアからコントローラに渡されたパラメータをコントローラは受け取ることができません。

これをコントローラー メソッドで直接使用できます

public function index(Request $request)
{
return $request->hello; // ThinkPHP
}

多くの

ThinkPHP チュートリアルビデオが PHP 中国語 Web サイトで入手できます。オンラインで学習することへようこそ!

この記事は、https://www.php.cn/phpkj/thinkphp/

から転載されています。

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

声明:
この記事はthinkphp.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。