Laravel はルーティングのグループ化をどのように実行するのでしょうか? 6つのルーティング組織技術の共有

青灯夜游
リリース: 2022-10-11 19:58:55
転載
2068 人が閲覧しました

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/HomeControllerUser/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

このファイルをロードするには、2 つの方法があります。私はこれを「Laravel メソッド」と「PHP メソッド」と呼びます。

Laravel がデフォルトのルート ファイルを構築する方法の構造を追跡したい場合は、

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.phproutes/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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!