Laravel はルーティングのグループ化をどのように実行するのでしょうか? 6つのルーティング組織技術の共有
Laravel ルーティングは、開発者が最初から学ぶ機能です。しかし、プロジェクトが成長するにつれて、増大するルーティング ファイルの管理がますます困難になり、正しい Route::get()
ステートメントを見つけるためにスクロールが必要になることがよくありました。幸いなことに、ルート ファイルを短くして読みやすくするテクニックがいくつかあります。ルートとその設定をグループ化するさまざまな方法を見てみましょう。
初心者レベルの単純な古い Route::group()
についてだけ説明するつもりはありません。もう少し深く掘り下げてみましょう。
グループ 1. Route::resource と Route::apiResource
部屋の中の象から始めましょう。これはおそらく最も一般的に使用されるグループです。 。モデルに関する一般的な CRUD 操作のセットがある場合は、それらを リソース コントローラー
にグループ化する必要があります。このようなコントローラーには 最大 7 つのメソッドが含まれます ( ただし、おそらく以下):
- index()
- create()
- store()
- show()
- edit( )
- update()
- destroy()
したがって、ルート セットがこれらのメソッドに対応する場合は、使用しないでください:
Route::get('books', [BookController::class, 'index'])->name('books.index'); Route::get('books/create', [BookController::class, 'create'])->name('books.create'); Route::post('books', [BookController::class, 'store'])->name('books.store'); Route::get('books/{book}', [BookController::class, 'show'])->name('books.show'); Route::get('books/{book}/edit', [BookController::class, 'edit'])->name('books.edit'); Route::put('books/{book}', [BookController::class, 'update'])->name('books.update'); Route::delete('books/{book}', [BookController::class, 'destroy'])->name('books.destroy');
… 行は 1 つだけです:
Route::resource('books', BookController::class);
API プロジェクトを使用する場合、作成/編集用のビジュアル フォームは必要ないため、 apiResource()
を使用して 7 つのメソッドで 5 つの異なる構文をカバーします:
Route::apiResource('books', BookController::class);
また、メソッドの代わりに 2 ~ 4 つのメソッドがある場合でも、リソース コントローラーを検討することをお勧めします。フル7。単純に、URL、メソッド、ルート名などの標準の命名規則が維持されているからです。たとえば、この場合、名前を手動で指定する必要はありません:
Route::get('books/create', [BookController::class, 'create'])->name('books.create'); Route::post('books', [BookController::class, 'store'])->name('books.store'); // 相反,这里的名称“books.create”和“books.store”是自动分配的 Route::resource('books', BookController::class)->only(['create', 'store']);
グループ 2. ネストされたサブルート グループ
もちろん、一般的な ルーティング グループ化 は誰でも知っています。ただし、より複雑なプロジェクトの場合は、1 レベルのグループ化では不十分な場合があります。
実践例: 認可ルーティングを auth
ミドルウェアとグループ化したいと考えていますが、内部的には管理者や単純なユーザーなど、さらに多くのサブグループを分離する必要があります。
Route::middleware('auth')->group(function() { Route::middleware('is_admin')->prefix('admin')->group(function() { Route::get(...) // administrator routes }); Route::middleware('is_user')->prefix('user')->group(function() { Route::get(...) // user routes }); });
グループ 3. 重複したミドルウェアをグループ化する
ミドルウェアが多数ある場合は、いくつかをルーティング グループに含めます。それが繰り返し起こったら?
Route::prefix('students')->middleware(['auth', 'check.role', 'check.user.status', 'check.invoice.status', 'locale'])->group(function () { // ... 学生路由 }); Route::prefix('managers')->middleware(['auth', 'check.role', 'check.user.status', 'locale'])->group(function () { // ... 管理员路由 });
ご覧のとおり、5 つのミドルウェアがあり、そのうち 4 つは重複しています。したがって、app/Http/Kernel.php
ファイルで、これら 4 つを別のミドルウェア グループに移動できます。
protected $middlewareGroups = [ // 此组是 Laravel 默认中间件组 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], // 此组是 Laravel 默认中间件组 'api' => [ // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], // 这是我们新的中间件组 'check_user' => [ 'auth', 'check.role', 'check.user.status', 'locale' ], ];
したがって、ミドルウェア グループ名は次のようになります。 check_user
、これでルートを短縮できます:
Route::prefix('students')->middleware(['check_user', 'check.invoice.status'])->group(function () { // ... student routes }); Route::prefix('managers')->middleware(['check_user'])->group(function () { // ... manager routes });
グループ 4. 同じ名前のコントローラー、異なる名前空間
たとえば、Admin/HomeController
や User/HomeController
など、さまざまなユーザー ロールに HomeController
を設定することは非常に一般的です。ルーティングでフル パスを使用する場合は、次のようになります:
Route::prefix('admin')->middleware('is_admin')->group(function () { Route::get('home', [\App\Http\Controllers\Admin\HomeController::class, 'index']); }); Route::prefix('user')->middleware('is_user')->group(function () { Route::get('home', [\App\Http\Controllers\User\HomeController::class, 'index']); });
フル パスは各コントローラーに使用されます。これは冗長ですよね。そのため、多くの開発者は、ルート リストに HomeController::class
のみを含めて、先頭に次のようなものを追加することを好みます。
use App\Http\Controllers\Admin\HomeController;
しかし、ここに問題があります。同じコントローラクラス名を持っています。したがって、これは機能しません:
use App\Http\Controllers\Admin\HomeController; use App\Http\Controllers\User\HomeController;
「管理バックエンド」のコントローラーはどれですか?そうですね、名前を変更して、そのうちの 1 つにエイリアスを割り当てるのも 1 つの方法です。
use App\Http\Controllers\Admin\HomeController as AdminHomeController; use App\Http\Controllers\User\HomeController; Route::prefix('admin')->middleware('is_admin')->group(function () { Route::get('home', [AdminHomeController::class, 'index']); }); Route::prefix('user')->middleware('is_user')->group(function () { Route::get('home', [HomeController::class, 'index']); });
しかし、個人的には、トップクラスの名前を変更すると混乱するので、もう 1 つのクラスの方が好きです。方法: コントローラーのサブフォルダーに名前空間 () を追加します:
Route::prefix('admin')->namespace('App\Http\Controllers\Admin')->middleware('is_admin')->group(function () { Route::get('home', [HomeController::class, 'index']); // ... Admin 命名空间中的其他控制器 }); Route::prefix('user')->namespace('App\Http\Controllers\User')->middleware('is_user')->group(function () { Route::get('home', [HomeController::class, 'index']); // ... 来自用户命名空间的其他控制器 });
グループ 5. ルーティング ファイルをデタッチします
routes/web.php
または routes/api.php
は大きすぎると感じます。いくつかのルートを別のファイルに入れることができます。任意の名前を付けることができます (例: #) ##routes/admin.php。
app/Providers/RouteServiceProvider.php をチェックしてください:
public function boot() { $this->configureRateLimiting(); $this->routes(function () { Route::middleware('api') ->prefix('api') ->group(base_path('routes/api.php')); Route::middleware('web') ->group(base_path('routes/web.php')); }); }
routes/api.php と
routes/web.php はどちらもここにありますが、設定が若干異なります。したがって、ここに管理ファイルを追加するだけです:
$this->routes(function () { Route::middleware('api') ->prefix('api') ->group(base_path('routes/api.php')); Route::middleware('web') ->group(base_path('routes/web.php')); Route::middleware('is_admin') ->group(base_path('routes/admin.php')); });
如果你不想深入研究 服务提供者,还有一种更简单的方法 - 只需 include/require 您的路由文件到另一个文件中,就像你在 Laravel 框架之外的任何 PHP 文件。
事实上,这是由 Taylor Otwell 完成的,只需将 routes/auth.php
文件直接放入 Laravel Breeze 路由:
routes/web.php:
Route::get('/', function () { return view('welcome'); }); Route::get('/dashboard', function () { return view('dashboard'); })->middleware(['auth'])->name('dashboard'); require __DIR__.'/auth.php';
分组 6. Laravel 9 中的新功能: Route::controller ()
如果你的 Controller 中有一些方法,但它们不遵循标准的 Resource 结构,您仍然可以对它们进行分组,而无需为每个方法重复 Controller 名称。
取而代之的是:
Route::get('profile', [ProfileController::class, 'getProfile']); Route::put('profile', [ProfileController::class, 'updateProfile']); Route::delete('profile', [ProfileController::class, 'deleteProfile']);
您可以这样做:
Route::controller(ProfileController::class)->group(function() { Route::get('profile', 'getProfile'); Route::put('profile', 'updateProfile'); Route::delete('profile', 'deleteProfile'); });
此功能在 Laravel 9 和 Laravel 8 的最新小版本中可用。
就是这样,这些分组技术有望帮助你组织和维护的路由,无论你的项目发展到多大。
原文地址:https://laravel-news.com/laravel-route-organization-tips
译文地址:https://learnku.com/laravel/t/68476
【相关推荐:laravel视频教程】
以上がLaravel はルーティングのグループ化をどのように実行するのでしょうか? 6つのルーティング組織技術の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

PHP と Flutter は、モバイル開発でよく使われるテクノロジです。 Flutter は、クロスプラットフォーム機能、パフォーマンス、ユーザー インターフェイスに優れており、高パフォーマンス、クロスプラットフォーム、カスタマイズされた UI を必要とするアプリケーションに適しています。 PHP は、クロスプラットフォームではなく、パフォーマンスが低いサーバー側アプリケーションに適しています。

PHP でのデータベース操作は、オブジェクトをリレーショナル データベースにマップする ORM を使用して簡素化されます。 Laravel の EloquentORM を使用すると、オブジェクト指向構文を使用してデータベースと対話できます。モデル クラスを定義したり、Eloquent メソッドを使用したり、実際にブログ システムを構築したりすることで ORM を使用できます。

PHP 単体テスト ツール分析: PHPUnit: 大規模プロジェクトに適しており、包括的な機能を提供し、インストールが簡単ですが、冗長で遅い場合があります。 PHPUnitWrapper: 小規模プロジェクトに適しており、使いやすく、Lumen/Laravel に最適化されていますが、機能が限られており、コード カバレッジ分析は提供されず、コミュニティ サポートも限られています。

Laravel 9 と CodeIgniter 4 の最新バージョンでは、更新された機能と改善が提供されます。 Laravel9はMVCアーキテクチャを採用しており、データベース移行、認証、テンプレートエンジンなどの機能を提供します。 CodeIgniter4 は、HMVC アーキテクチャを使用してルーティング、ORM、およびキャッシュを提供します。パフォーマンスの面では、Laravel9 のサービスプロバイダーベースの設計パターンと CodeIgniter4 の軽量フレームワークにより、優れたパフォーマンスが得られます。実際のアプリケーションでは、Laravel9 は柔軟性と強力な機能を必要とする複雑なプロジェクトに適しており、CodeIgniter4 は迅速な開発や小規模なアプリケーションに適しています。

Laravel - アーティザン コマンド - Laravel 5.7 には、新しいコマンドを処理およびテストするための新しい方法が付属しています。これには職人コマンドをテストする新しい機能が含まれており、そのデモについては以下で説明します。

Laravel と CodeIgniter のデータ処理機能を比較します。 ORM: Laravel はクラスとオブジェクトのリレーショナル マッピングを提供する EloquentORM を使用しますが、CodeIgniter は ActiveRecord を使用してデータベース モデルを PHP クラスのサブクラスとして表します。クエリビルダー: Laravel には柔軟なチェーンクエリ API がありますが、CodeIgniter のクエリビルダーはよりシンプルで配列ベースです。データ検証: Laravel はカスタム検証ルールをサポートする Validator クラスを提供しますが、CodeIgniter には組み込みの検証関数が少なく、カスタム ルールの手動コーディングが必要です。実践例:ユーザー登録例はLarを示しています

大規模プロジェクト用のフレームワークを選択する場合、Laravel と CodeIgniter にはそれぞれ独自の利点があります。 Laravel はエンタープライズレベルのアプリケーション向けに設計されており、モジュール設計、依存関係の注入、強力な機能セットを提供します。 CodeIgniter は、速度と使いやすさを重視した、小規模から中規模のプロジェクトに適した軽量フレームワークです。複雑な要件と多数のユーザーを伴う大規模なプロジェクトには、Laravel のパワーとスケーラビリティがより適しています。単純なプロジェクトやリソースが限られている状況では、CodeIgniter の軽量で迅速な開発機能がより理想的です。

PHP 単体テストおよび統合テスト ガイド 単体テスト: コードまたは関数の単一単位に焦点を当て、PHPUnit を使用して検証用のテスト ケース クラスを作成します。統合テスト: 複数のコードユニットがどのように連携するかに注意し、PHPUnit の setUp() メソッドと TearDown() メソッドを使用してテスト環境をセットアップおよびクリーンアップします。実際のケース: PHPUnit を使用して、データベースの作成、サーバーの起動、テストコードの作成など、Laravel アプリケーションの単体テストと統合テストを実行します。
