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

爱喝马黛茶的安东尼
リリース: 2019-12-16 13:22:20
転載
7544 人が閲覧しました

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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!