Heim > PHP-Framework > Laravel > Wie führt Laravel die Routing-Gruppierung durch? Gemeinsame Nutzung von 6 Routing-Organisationstechnologien

Wie führt Laravel die Routing-Gruppierung durch? Gemeinsame Nutzung von 6 Routing-Organisationstechnologien

青灯夜游
Freigeben: 2022-10-11 19:58:55
nach vorne
2131 Leute haben es durchsucht

Wie führt Laravel die Routing-Gruppierung durch? Gemeinsame Nutzung von 6 Routing-Organisationstechnologien

Laravel-Routing ist eine Funktion, die Entwickler von Anfang an lernen. Doch als ihr Projekt wuchs, wurde es immer schwieriger, die wachsenden Routing-Dateien zu verwalten, sodass oft ein Scrollen erforderlich war, um die richtige Route::get()-Anweisung zu finden. Glücklicherweise gibt es einige Techniken, um Routendateien kürzer und besser lesbar zu machen. Schauen wir uns verschiedene Möglichkeiten zum Gruppieren von Routen und deren Einstellungen an. 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');
Nach dem Login kopieren

… 您可能只有一行:

Route::resource('books', BookController::class);
Nach dem Login kopieren

如果您使用 API 项目,则不需要用于创建 / 编辑的可视化表单,因此您可以使用 apiResource() 的涵盖 7 种方法中的 5 种不同语法:

Route::apiResource('books', BookController::class);
Nach dem Login kopieren

此外,我建议您考虑资源控制器,即使您有 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']);
Nach dem Login kopieren

分组 2. 嵌套子路由组

当然,一般的 路由分组 大家都知道。 但对于更复杂的项目,一级分组可能还不够。

实际示例:您希望授权路由与 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
    });
});
Nach dem Login kopieren

分组 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 () {
    // ... 管理员路由
});
Nach dem Login kopieren

如您所见,有 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'
    ],
];
Nach dem Login kopieren

所以将我们的中间件组命明为 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
});
Nach dem Login kopieren

分组 4. 同名控制器,不同命名空间

很常见的情况是,例如,为不同的用户角色设置了 HomeController,例如 Admin/HomeControllerUser/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']);
});
Nach dem Login kopieren

每个控制器都是用了完整的路径这看上去很冗余,对吧? 这就是为什么许多开发人员更喜欢在路由列表中只包含 HomeController::class 并在顶部添加类似这样的内容:

use App\Http\Controllers\Admin\HomeController;
Nach dem Login kopieren

但是这里的问题是我们有相同的控制器类名! 所以,这行不通:

use App\Http\Controllers\Admin\HomeController;
use App\Http\Controllers\User\HomeController;
Nach dem Login kopieren

哪一个是「管理后台」的控制器?好吧,一种方法是更改名称并为其中之一分配别名:

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']);
});
Nach dem Login kopieren

但是,就个人而言,更改顶部类的名称让我很困惑,我喜欢另一种方法:为控制器的子文件夹添加一个命名空间():

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']);
    // ... 来自用户命名空间的其他控制器
});
Nach dem Login kopieren

分组 5. 分离路由文件

如果你觉得 routes/web.phproutes/api.php 太大了,可以把一些路由放到一个单独的文件中,你可以为它任意命名,例如 routes/admin.php

要加载该文件,有两种方法:我称之为 「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'));
    });
}
Nach dem Login kopieren

routes/api.phproutes/web.php

Wir werden nicht nur über das einfache alte Route::group() sprechen, das ist das Anfängerniveau. Lassen Sie uns etwas tiefer graben.

Gruppe 1. Route::resource und Route::apiResource

Beginnen wir mit dem Elefanten im Raum: Das könnte The sein Die am häufigsten verwendete Gruppierung. Wenn Sie über einen typischen Satz von CRUD-Operationen rund um ein Modell verfügen, sollten Sie diese in Ressourcencontroller< / gruppieren. a>🎜🎜Diese Art von Controller enthält bis zu 7 Methoden< /a > (aber wahrscheinlich weniger): 🎜
  • index()
  • create()
  • store()
  • show()
  • edit()
  • update()
  • destroy()
🎜Wenn Ihr Routensatz also diesen Methoden entspricht, tun Sie dies bitte nicht Verwenden Sie: 🎜🎜
$this->routes(function () {
    Route::middleware(&#39;api&#39;)
        ->prefix(&#39;api&#39;)
        ->group(base_path(&#39;routes/api.php&#39;));

    Route::middleware(&#39;web&#39;)
        ->group(base_path(&#39;routes/web.php&#39;));

    Route::middleware(&#39;is_admin&#39;)
        ->group(base_path(&#39;routes/admin.php&#39;));
});
Nach dem Login kopieren
🎜🎜… Sie dürfen nur eine Zeile haben: 🎜🎜
Route::get(&#39;/&#39;, function () {
    return view(&#39;welcome&#39;);
});

Route::get(&#39;/dashboard&#39;, function () {
    return view(&#39;dashboard&#39;);
})->middleware([&#39;auth&#39;])->name(&#39;dashboard&#39;);

require __DIR__.&#39;/auth.php&#39;;
Nach dem Login kopieren
Nach dem Login kopieren
🎜🎜 Wenn Sie ein API-Projekt verwenden, benötigen Sie kein visuelles Formular zum Erstellen/Bearbeiten, daher können Sie apiResource()< verwenden. code> deckt 5 verschiedene Syntaxen von 7 Methoden ab: 🎜🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;" style="max-height: none;">Route::get(&amp;#39;profile&amp;#39;, [ProfileController::class, &amp;#39;getProfile&amp;#39;]); Route::put(&amp;#39;profile&amp;#39;, [ProfileController::class, &amp;#39;updateProfile&amp;#39;]); Route::delete(&amp;#39;profile&amp;#39;, [ProfileController::class, &amp;#39;deleteProfile&amp;#39;]);</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜🎜 Außerdem empfehle ich Ihnen, Ressourcencontroller in Betracht zu ziehen, auch wenn Sie 2-4 Methoden anstelle der vollständigen 7 haben. Ganz einfach, weil es Standard-Namenskonventionen einhält – für URLs, Methoden und Routennamen. In diesem Fall müssen Sie den Namen beispielsweise nicht manuell angeben: 🎜🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;" style="max-height: none;">Route::controller(ProfileController::class)-&gt;group(function() { Route::get(&amp;#39;profile&amp;#39;, &amp;#39;getProfile&amp;#39;); Route::put(&amp;#39;profile&amp;#39;, &amp;#39;updateProfile&amp;#39;); Route::delete(&amp;#39;profile&amp;#39;, &amp;#39;deleteProfile&amp;#39;); });</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜<hr/><h2 id="8fdc83"><strong>Gruppe 2. Verschachtelte Unterroutengruppen</strong></ h2> 🎜Natürlich kennt jeder allgemeine <a href="https://learnku.com/docs/laravel/9.x/routing#route-groups">Routing-Gruppen</a>. Bei komplexeren Projekten reicht eine Gruppierungsebene jedoch möglicherweise nicht aus. 🎜🎜Praxisbeispiel: Sie möchten, dass Autorisierungsrouten mit der Middleware <code>auth gruppiert werden, intern müssen Sie jedoch weitere Untergruppen trennen, z. B. Administratoren und einfache Benutzer. 🎜🎜rrreee🎜

Gruppierung 3. Gruppieren Sie doppelte Middlewares

🎜Wenn Sie viele Middlewares haben, haben Sie einige in Routinggruppen. Was zu tun ist wenn es wiederholt passiert? 🎜🎜rrreee🎜🎜Wie Sie sehen können, gibt es 5 Middlewares, von denen 4 Duplikate sind. Daher können wir in der Datei app/Http/Kernel.php diese 4 in eine separate Middleware-Gruppe verschieben: 🎜🎜rrreee🎜🎜Benennen Sie unsere Middleware-Gruppe also als check_user , jetzt können wir die Route abkürzen: 🎜🎜rrreee🎜

Gruppe 4. Gleicher Controller, anderer Namespace🎜Es kommt sehr häufig vor, um beispielsweise HomeController für verschiedene Benutzerrollen festzulegen, wie z. B. Admin/HomeController und User/HomeController. Wenn Sie beim Routing den vollständigen Pfad verwenden, sieht das so aus: 🎜🎜rrreee🎜🎜Der vollständige Pfad wird für jeden Controller verwendet. Das scheint überflüssig zu sein, oder? Aus diesem Grund ziehen es viele Entwickler vor, nur HomeController::class in der Routenliste zu haben und oben etwas wie dieses hinzuzufügen: 🎜🎜rrreee🎜🎜 Aber das Problem hierbei ist, dass wir denselben Controller-Klassennamen haben ! Das funktioniert also nicht: 🎜🎜rrreee🎜🎜Welcher ist der Controller des „Admin-Backends“? Nun, eine Möglichkeit besteht darin, den Namen zu ändern und einer von ihnen einen Alias ​​zuzuweisen: 🎜🎜rrreee🎜🎜 Aber persönlich verwirrt mich die Änderung des Namens der Oberklasse, ich bevorzuge eine andere Möglichkeit: Für den Controller einen Namespace hinzufügen () zum Unterordner: 🎜🎜rrreee🎜

Gruppe 5. Separate Routing-Dateien

🎜Wenn Sie das Gefühl haben, routes/web.php< /code> oder <code>routes/api.php ist zu groß. Sie können einige Routen in eine separate Datei einfügen. Sie können sie beliebig benennen, z. B. routes /admin.php</. Code>. 🎜🎜Um diese Datei zu laden, gibt es zwei Möglichkeiten: Ich nenne sie den „Laravel-Weg“ und den „PHP-Weg“. 🎜🎜Wenn Sie der Struktur folgen möchten, wie Laravel seine Standardroutendateien erstellt, schauen Sie sich <strong>app/Providers/RouteServiceProvider.php</strong> an: 🎜🎜rrreee🎜🎜<code>routes/api.php</ code> und < code>routes/web.php sind alle hier, aber die Einstellungen unterscheiden sich geringfügig. Sie müssen also nur die Admin-Datei hier hinzufügen: 🎜🎜rrreee🎜

如果你不想深入研究 服务提供者,还有一种更简单的方法 - 只需 include/require 您的路由文件到另一个文件中,就像你在 Laravel 框架之外的任何 PHP 文件。

事实上,这是由 Taylor Otwell 完成的,只需将 routes/auth.php 文件直接放入 Laravel Breeze 路由

routes/web.php:

Route::get(&#39;/&#39;, function () {
    return view(&#39;welcome&#39;);
});

Route::get(&#39;/dashboard&#39;, function () {
    return view(&#39;dashboard&#39;);
})->middleware([&#39;auth&#39;])->name(&#39;dashboard&#39;);

require __DIR__.&#39;/auth.php&#39;;
Nach dem Login kopieren
Nach dem Login kopieren

分组 6. Laravel 9 中的新功能: Route::controller ()

如果你的 Controller 中有一些方法,但它们不遵循标准的 Resource 结构,您仍然可以对它们进行分组,而无需为每个方法重复 Controller 名称。

取而代之的是:

Route::get(&#39;profile&#39;, [ProfileController::class, &#39;getProfile&#39;]);
Route::put(&#39;profile&#39;, [ProfileController::class, &#39;updateProfile&#39;]);
Route::delete(&#39;profile&#39;, [ProfileController::class, &#39;deleteProfile&#39;]);
Nach dem Login kopieren
Nach dem Login kopieren

您可以这样做:

Route::controller(ProfileController::class)->group(function() {
    Route::get(&#39;profile&#39;, &#39;getProfile&#39;);
    Route::put(&#39;profile&#39;, &#39;updateProfile&#39;);
    Route::delete(&#39;profile&#39;, &#39;deleteProfile&#39;);
});
Nach dem Login kopieren
Nach dem Login kopieren

此功能在 Laravel 9 和 Laravel 8 的最新小版本中可用。


就是这样,这些分组技术有望帮助你组织和维护的路由,无论你的项目发展到多大。

原文地址:https://laravel-news.com/laravel-route-organization-tips

译文地址:https://learnku.com/laravel/t/68476

【相关推荐:laravel视频教程

Das obige ist der detaillierte Inhalt vonWie führt Laravel die Routing-Gruppierung durch? Gemeinsame Nutzung von 6 Routing-Organisationstechnologien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage