ホームページ  >  記事  >  PHPフレームワーク  >  Thinkphp5.1ではミドルウェアの使い方を詳しく解説

Thinkphp5.1ではミドルウェアの使い方を詳しく解説

WBOY
WBOY転載
2022-04-24 11:56:104131ブラウズ

この記事では、thinkphp に関する関連知識を提供します。主に、プレミドルウェア、ポストミドルウェア、ルーティング ミドルウェア、グローバル ミドルウェア、その他の関連コンテンツなど、ミドルウェアの使用方法を紹介します。一緒に見てください。皆さんのお役に立てれば幸いです。

Thinkphp5.1ではミドルウェアの使い方を詳しく解説

## 推奨学習: 「

PHP ビデオ チュートリアル

1. ミドルウェアの役割

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

HTTP リクエストをインターセプトまたはフィルタリングし、必要なビジネス処理を実行するために使用されます。たとえば、ミドルウェアを使用して、ユーザーのリクエスト情報に 1 文のトロイの木馬が含まれているかどうかを確認できます。

動作フックとミドルウェアの違い:

ミドルウェア: プロジェクトのリクエストを処理します。ユーザーがプロジェクトにアクセスすると、ミドルウェアは、ユーザーがこのリクエストに対する権限を持っているかどうか、またはユーザーが不正なアクセスを持っているかどうかを判断できます;

動作フック: アクションの開始時または終了時 トリガーされるメソッド (例:成功したユーザー登録のログ記録;

ミドルウェアはユーザーのリクエストを処理し、フックはユーザーのアクションを処理します。ミドルウェアはフィルターに相当し、フックはイベントに相当します。AOP の考え方を採用しています。

2. ミドルウェアの定義

まず、cmd コマンド ライン コマンドを使用してミドルウェアを簡単に生成できます。プロジェクト:

php think make:middleware Check
このコマンドは、

application/http/middleware ディレクトリに Check ミドルウェアを生成します。コードは次のとおりです:

<?php

namespace app\http\middleware;

class Check
{
    public function handle($request, \Closure $next)
    {
        if ($request->param('name') == 'index') {
            return redirect('/');//重定向到首页
        }

        return $next($request);//返回的是一个Response对象
    }
}

ミドルウェアの説明:

1. ミドルウェアのエントリ実行メソッドは

handle メソッドである必要があり、最初のパラメータは Request## です。 # オブジェクト、および 2 番目の各パラメータはクロージャです; 2. ミドルウェア

handle

メソッドの戻り値は、Response オブジェクトである必要があります; 3. ミドルウェア Request オブジェクトを直接使用してリクエスト パラメーターを取得できます;

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

public function handle($request, \Closure $next, $name){
    if ($name == 'index') {
        return redirect('/');//重定向到首页
    }

    return $next($request);
}

1. プレミドルウェアの前

プレミドルウェアとは、http リクエストが完了する前にミドルウェア コードが実行されることを意味します。

<?php

namespace app\http\middleware;

class Before
{
    public function handle($request, \Closure $next)
    {
        // 先执行中间件代码
        return $next($request);
    }
}

2. ポストミドルウェア

ポストミドルウェアとは、http リクエストが完了した後にミドルウェア コードの実行が開始されることを意味します。

<?php

namespace app\http\middleware;

class After
{
    public function handle($request, \Closure $next)
    {
		$response = $next($request);
        //后执行中间件代码
        return $response;
    }
}

3. 登録ミドルウェア

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

名前が示すように、特定の条件下で指定されます。ルート このミドルウェアが呼び出されます。つまり、ユーザーがこのルーティング リンクにアクセスすると、このミドルウェアが実行されます。

//用户登录的路由
Route::rule(&#39;login&#39;,&#39;index/User/login&#39;)->middleware('Auth');

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

Route::rule('login','index/User/login')->middleware(app\http\middleware\Auth::class);

注:

名前空間が存在しない場合は、ミドルウェアの登録に完全なクラス名を使用することをお勧めします。デフォルトでは、app\http\middleware が名前空間として使用されます

同じルートで複数のミドルウェアの登録もサポートされており、ミドルウェア内でカンマで区切るだけで済みます。 ():
Route::rule('login','index/User/login')->middleware(['Auth', 'Check']);

Thinkphp5.1.8 バージョン以降、次のようにルーティング グループのミドルウェアの登録をサポートします:

//一个名为user的路由分组
Route::group('user', function(){
	Route::rule('login','index/User/login');
    Route::rule('register','index/User/register');
})->middleware('Auth');

2。グローバル ミドルウェア

は、すべて (グローバル) を意味します。 ) HTTP アクセス要求は、このミドルウェアを自動的に呼び出します。

アプリケーション ディレクトリに

middleware.php

ファイルを作成します。コードは次のとおりです:

<?php
return [
    //第1个中间件
	\app\http\middleware\Auth::class,
    //第2个中间件(Check中间件没有指定命名空间,所以会默认使用app\http\middleware作为命名空间)
    &#39;Check&#39;,
];
3. モジュール middleware

Thinkphp5 .1.8

バージョン以降はモジュールミドルウェア定義をサポートしています。モジュールディレクトリ直下に middleware.php ファイルを追加できます。定義方法は グローバルミドルウェア定義と同じです, ただし、このモジュール内にのみ存在します。以下が有効になります。 4. コントローラー ミドルウェア

Thinkphp5.1.17

バージョン以降では、コントローラーのミドルウェアの定義がサポートされています。まず、コントローラーはシステムの think\Controller クラスを継承し、次にコントローラーで middleware 属性を定義する必要があります (例: <pre class="brush:php;toolbar:false">&lt;?php namespace app\index\controller; use think\Controller; class Index extends Controller{ protected $middleware = [&amp;#39;Auth&amp;#39;]; public function index() { return &amp;#39;index&amp;#39;; } }</pre>5)。定義ミドルウェア

いくつかの単純な状況では、ミドルウェア クラスを使用する必要はありません。現時点では、クロージャを使用してミドルウェアを定義できますが、クロージャ関数は

Response

オブジェクト インスタンスを返す必要があります。 。

Route::group(&#39;hello&#39;, function(){
	Route::rule(&#39;login&#39;,&#39;index/User/login&#39;);
})->middleware(function($request,\Closure $next){
    if ($request->param('name') == 'index') {
        return redirect('/');//重定向到首页
    }    
	return $next($request);
});

4. ミドルウェアにパラメータを渡す

1. グローバル ミドルウェアにパラメータを渡す

<?php
return [
	[\app\http\middleware\Auth::class, &#39;张三&#39;],
    &#39;Check:李四&#39;,
];

上面的定义表示给Auth中间件传入参数为张三,给Check中间件传入参数为李四

2、路由中间件传参数

(1)、给Auth中间件传入参数张三

Route::rule(&#39;login&#39;,&#39;index/User/login&#39;)->middleware('Auth:张三');

 也可以这样写:

Route::rule('login','index/User/login')->middleware(Auth::class, '张三');

(2)、给多个中间件传入同一个参数 

Route::rule('login','index/User/login')->middleware([Auth::class, 'Check'], '张三');

(3)、单独指定各个中间件的参数

Route::rule('login','index/user/login')->middleware(['Auth:张三', 'Check:李四']);

五、中间件向控制器传参数

前面讲的给中间件传入特定的参数 (常量),那么中间要如何向控制器传入参数呢?我们可以通过给Request请求对象赋值的方式传参给控制器(或者其它地方),例如:

<?php
namespace app\http\middleware;

class Auth
{
    public function handle($request, \Closure $next)
    {
        //给控制器传参数
        $request->result = '验证成功';       
        return $next($request);
    }
}

需要特别注意:传递的变量名称不要和Request已有的参数变量名有冲突,比如用户登录请求的Request参数里已经有一个username,那么中间件向控制器传参,就不能再用这个username了,否则会改变原来参数的值。

然后在控制器的方法里面可以直接使用:

public function index(Request $request)
{
	return $request->result;
}

推荐学习:《PHP视频教程

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

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