ホームページ >バックエンド開発 >PHPチュートリアル >Laravel学習メモ - ルーティング(ミドルウェアとルーティンググループ)
この記事には次のセクションが含まれています。読む前に、公式ドキュメントの関連部分を簡単に読んでおくことをお勧めします。
ミドルウェア
ルートグループ
公式ドキュメントでは、この部分はルーティングの後ろにありますが、より合理的な前に移動したいと思います。
これは何ですか?
ルーティングは、クライアントからのリクエストを分析し、ルーティング ルールに従って対応する処理ロジックにリクエストを分配するプロセスであることはわかっています。しかし、舞台裏に例えてみましょう。バックエンドには誰もがアクセスできるわけではありません。正式な処理ロジックの前に、権限があるかどうか、要求されたデータが合法であるかどうかなどの検証を行う必要があります。
このとき、ルーティング プロセスの一部??ミドルウェアが機能します。
HTTP ミドルウェアは、アプリケーションに入る HTTP リクエストをフィルタリングする便利なメカニズムを提供します。たとえば、Laravel には、ユーザーが認証されていない場合にユーザーをログイン ページに誘導するミドルウェアがデフォルトで含まれています。ユーザーが認証されると、ミドルウェアはリクエストの続行を許可します。
上記の内容は、中国語版のlaravel5ドキュメントからのものであり、ミドルウェアの役割を非常によく説明しています。 laravel5以前のバージョンではフィルター(ルーティングフィルター)のみでしたが、ミドルウェアの目的は現在のミドルウェアと同様で、リクエストと処理ロジックの間の中間処理として使用されるのが一般的です。事後の判断と検証。ミドルウェアを介することで、バックグラウンドコントローラーと同様に、訪問者が誰かを意識することなく、ユーザーリストや記事リストの表示、追加された記事の処理などに集中するだけでコントローラー内の独自のロジックに集中できます。は正当なバックエンド管理者であるため、アクセス許可の検証作業はミドルウェアに任せる必要があります。ミドルウェア検証に合格した場合は通常どおり処理され、失敗した場合はリダイレクトされるなどの処理が行われます。
Laravel にはデフォルトで多くのミドルウェアが組み込まれており、デフォルトで有効になっています。 app/Http/Kernel.php を編集することで、これらのミドルウェアを有効にするかどうかを決定できます。自分で開発したミドルウェアもここに登録されます。
app/Http/Kernel.php の $middleware 配列はグローバル ミドルウェアです。つまり、内部の CSRF 検証ミドルウェアなど、これらのミドルウェアを使用して任意のルートが適用されます。
グローバル ミドルウェアが必要ない場合もあります。この場合、特定のミドルウェアを app/Http/Kernel.php ファイルの $routeMiddleware 配列に登録できます。配列のキー名はミドルウェアのエイリアスです。キーの値は、
'auth' => 'AppHttpMiddlewareAuthMiddleware' などのミドルウェア クラスに固有です。
特定のルートで特定のミドルウェアを使用する方法については、以下に続けて説明します。
app/Http/Kernel.php ファイルの $routeMiddleware 配列に独立したミドルウェアを登録しました。このミドルウェアは単独で使用することも、ルートおよびルーティング グループにバインドすることもできます。ルートを定義するときは、次のようになります:
Route::get('admin/profile', ['middleware' => 'auth', function(){ //}]);
http://yourdomain/admin/profile にアクセスすると、最初にグローバル ミドルウェアを通過し、次に app/Http の $routeMiddleware 配列を通過します。 /Kernel.php auth という名前の定義済みミドルウェア。
定義方法についてこれまで述べてきましたが、ミドルウェア クラスはどのようにあるべきでしょうか?ドキュメントを読んだことがある方は、次のようになっていることがわかると思います (以下のコードとドキュメントにはいくつかの違いがあります):
<?phpnamespace App\Http\Middleware;use Closure;use Auth;class AuthMiddleware { /** * Run the request filter. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { // If the user is not logged in if (Auth::guest()) { if ($request->ajax()) { return response('Unauthorized!', 401); } else { return redirect()->guest('admin/login'); } } view()->share('loign', true); return $next($request); }}
上記のコードは記述されたミドルウェアであり、handle メソッドの内容はミドルウェアの実際のコード。
コードの 18 行目から 27 行目は、おそらくユーザーがログインしているかどうかを判断するプロセスであることがわかります。ログインしていない場合は、リクエストが ajax タイプであるかどうかが判断され、ajax タイプのリクエストは を返します。 「権限がありません。」というメッセージが表示された json データ (理解してください)、それが標準リクエストの場合、ログイン インターフェイスにリダイレクトされます。
検証または操作前のロジックがミドルウェアに渡される場合、ミドルウェアがない場合は、コード return $next($request) (上記の例の 28 行目) を使用してリクエストを次のミドルウェアに送信することを忘れないでください。後のソフトウェアでは、処理ロジック (コントローラーなど) を取得します。
上記のミドルウェアは運用前ミドルウェアです。これはどういう意味ですか?実際の処理ロジックの前に動作するミドルウェアであり、プレミドルウェアです。逆に、実際の処理ロジックを実行した後に渡されるミドルウェアがポストミドルウェアです。
ミドルウェア後の構造は次のとおりです:
<?phpnamespace App\Http\Middleware;class AfterMiddleware implements Middleware { public function handle($request, Closure $next) { $response = $next($request); // 具体的中间件逻辑代码 return $response; }}
$response = $next($request) が追加され、戻り値も変更されていることが違いであることがわかります。 $next($request) によって返される値は、リクエスト全体が多数の特定の処理ロジックを経た後に生成される最終的な応答であることは容易に理解できます。この応答は通常、HTML コードの束 (レンダリングされたビュー) であるか、またはその可能性があります。 json などにするこのレスポンスに対してミドルウェアで最終処理を実行し、最終的に処理結果を返すことができます。
この公式ドキュメントには非常に詳しく説明されていますが、理解するのは簡単ではないようです。まず、適用可能なシナリオについて説明します。
ルーティング グループは、特定の種類のルートをグループ化するためによく使用されます。このルーティング グループに割り当てられたミドルウェア、フィルターなどは、グループ内のすべてのルートに適用されます。
说白了,路由组就是简化一部分路由定义过程的。比如,后台的我都想通过地址http://yourdomain/admin/***访问,假如我有用户(user)、文章(article)两个模块,他们的访问都要经过一个验证权限的中间件,我需要这样定义路由:
Route::get('admin/user', ['middleware' => 'authority', function() { // blablabla...}]);Route::get('admin/article', ['middleware' => 'authority', function() { // blablabla...}]);
现在只有两条路由,我多写几个admin,middleware没啥的,但系统庞大以后,每个都要单独写对应的中间件,容易出错,不易管理。这时候,就应该使用路由组:
Route::group(['prefix' => 'admin', 'middleware' => 'authority'], function() { Route::get('user', function() { // blablabla... }); Route::get('article', function() { // blablabla... });});
同时,利用路由组,定义子域名变得十分容易:
Route::group(['domain' => 'bbs.yourdomain.com'], function() { Route::get('topic', function() { // blablabla... }); Route::get('node', function() { // blablabla... });});
子域名也可以拥有通配符,以此实现更为灵活的结构。比如我希望我的网站每一个用户都拥有自己的二级域名,类似于这样:userA.yourdomain.com,userB.yourdomain.com。这时候可以这样写:
Route::group(['domain' => '{username}.myapp.com'], function(){ Route::get('profile/{type}', function($username, $type) { // });});
可以通过参数获取域名上的通配符匹配的值。
除这些以外,路由组带来的便利相当丰富,在这里基本把路由组存在的意义说完了,其他关于路由组的可以移步至官方文档了解。