ホームページ > 記事 > PHPフレームワーク > Thinkphp5.1ではミドルウェアの使い方を詳しく解説
この記事では、thinkphp に関する関連知識を提供します。主に、プレミドルウェア、ポストミドルウェア、ルーティング ミドルウェア、グローバル ミドルウェア、その他の関連コンテンツなど、ミドルウェアの使用方法を紹介します。一緒に見てください。皆さんのお役に立てれば幸いです。
## 推奨学習: 「PHP ビデオ チュートリアル 」
HTTP リクエストをインターセプトまたはフィルタリングし、必要なビジネス処理を実行するために使用されます。たとえば、ミドルウェアを使用して、ユーザーのリクエスト情報に 1 文のトロイの木馬が含まれているかどうかを確認できます。
動作フックとミドルウェアの違い:
ミドルウェア: プロジェクトのリクエストを処理します。ユーザーがプロジェクトにアクセスすると、ミドルウェアは、ユーザーがこのリクエストに対する権限を持っているかどうか、またはユーザーが不正なアクセスを持っているかどうかを判断できます;
動作フック: アクションの開始時または終了時 トリガーされるメソッド (例:成功したユーザー登録のログ記録;
ミドルウェアはユーザーのリクエストを処理し、フックはユーザーのアクションを処理します。ミドルウェアはフィルターに相当し、フックはイベントに相当します。AOP の考え方を採用しています。
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
handleメソッドである必要があり、最初のパラメータは
Request## です。 # オブジェクト、および 2 番目の各パラメータはクロージャです;2. ミドルウェア
メソッドの戻り値は、
Response
オブジェクトである必要があります;3. ミドルウェア Request オブジェクトを直接使用してリクエスト パラメーターを取得できます;
4. 特定の要件の下では、3 番目のパラメーターを使用して追加パラメーターを渡すことができます;
public function handle($request, \Closure $next, $name){ if ($name == 'index') { return redirect('/');//重定向到首页 } return $next($request); }1. プレミドルウェアの前
<?php namespace app\http\middleware; class Before { public function handle($request, \Closure $next) { // 先执行中间件代码 return $next($request); } }
2. ポストミドルウェア
<?php namespace app\http\middleware; class After { public function handle($request, \Closure $next) { $response = $next($request); //后执行中间件代码 return $response; } }3. 登録ミドルウェア
//用户登录的路由 Route::rule('login','index/User/login')->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。グローバル ミドルウェア
アプリケーション ディレクトリに
middleware.php ファイルを作成します。コードは次のとおりです: <?php
return [
//第1个中间件
\app\http\middleware\Auth::class,
//第2个中间件(Check中间件没有指定命名空间,所以会默认使用app\http\middleware作为命名空间)
'Check',
];
3. モジュール middleware
バージョン以降はモジュールミドルウェア定義をサポートしています。モジュールディレクトリ直下に middleware.php
ファイルを追加できます。定義方法は グローバルミドルウェア
定義と同じです, ただし、このモジュール内にのみ存在します。以下が有効になります。 4. コントローラー ミドルウェア
バージョン以降では、コントローラーのミドルウェアの定義がサポートされています。まず、コントローラーはシステムの think\Controller
クラスを継承し、次にコントローラーで middleware
属性を定義する必要があります (例: <pre class="brush:php;toolbar:false"><?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller{
protected $middleware = [&#39;Auth&#39;];
public function index()
{
return &#39;index&#39;;
}
}</pre>
5)。定義ミドルウェア
オブジェクト インスタンスを返す必要があります。 。 Route::group('hello', function(){
Route::rule('login','index/User/login');
})->middleware(function($request,\Closure $next){
if ($request->param('name') == 'index') {
return redirect('/');//重定向到首页
}
return $next($request);
});
上面的定义表示给Auth中间件传入参数为张三,给Check中间件传入参数为李四 2、路由中间件传参数 (1)、给Auth中间件传入参数张三 也可以这样写: (2)、给多个中间件传入同一个参数 (3)、单独指定各个中间件的参数 前面讲的给中间件传入特定的参数 (常量),那么中间要如何向控制器传入参数呢?我们可以通过给Request请求对象赋值的方式传参给控制器(或者其它地方),例如: 需要特别注意:传递的变量名称不要和Request已有的参数变量名有冲突,比如用户登录请求的Request参数里已经有一个username,那么中间件向控制器传参,就不能再用这个username了,否则会改变原来参数的值。 然后在控制器的方法里面可以直接使用: 推荐学习:《PHP视频教程》<?php
return [
[\app\http\middleware\Auth::class, '张三'],
'Check:李四',
];
Route::rule('login','index/User/login')->middleware('Auth:张三');
Route::rule('login','index/User/login')->middleware(Auth::class, '张三');
Route::rule('login','index/User/login')->middleware([Auth::class, 'Check'], '张三');
Route::rule('login','index/user/login')->middleware(['Auth:张三', 'Check:李四']);
五、中间件向控制器传参数
<?php
namespace app\http\middleware;
class Auth
{
public function handle($request, \Closure $next)
{
//给控制器传参数
$request->result = '验证成功';
return $next($request);
}
}
public function index(Request $request)
{
return $request->result;
}
以上がThinkphp5.1ではミドルウェアの使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。