Heim  >  Artikel  >  PHP-Framework  >  Lassen Sie uns darüber sprechen, wie Sie das Routing in großen Laravel-Projekten organisieren

Lassen Sie uns darüber sprechen, wie Sie das Routing in großen Laravel-Projekten organisieren

青灯夜游
青灯夜游nach vorne
2022-12-14 20:32:261632Durchsuche

Lassen Sie uns darüber sprechen, wie Sie das Routing in großen Laravel-Projekten organisieren

Stellen Sie sich ein Laravel-Projekt mit über 100 Routen vor, einschließlich separater Module für Gast, Benutzer, Administrator usw. Wollen Sie wirklich alles in eine Datei schreiben? Wie gruppiert man sie und fügt der URL ein Präfix hinzu? Sehen Sie, welche Optionen verfügbar sind.


1. Separates WEB- und API-Routing

Das ist einfach, denn Laravel hat es bereits für Sie erledigt. Es gibt die folgenden zwei Dateien:

Wenn Ihr Projekt also sowohl Front-End-Seiten als auch eine API hat (die Verwendungsszenarien werden immer umfangreicher und breiter), fügen Sie bitte die API-Routen in api.php ein. [Verwandte Empfehlung: Laravel-Video-Tutorial]

Wenn Sie beispielsweise eine /users-Seite und einen /api/users/-Endpunkt haben, schreiben Sie diese separat in ihre eigenen Routing-Dateien, um zu vermeiden, dass sie sich in derselben Datei befinden Durch das Vorhandensein des gleichen Namens kommt es zu Verwirrung.

Aber ich habe kürzlich ein Gegenbeispiel vom offiziellen Laravel-Projekt gesehen. In Laravel Horizon hat Taylor nur API-Routing, aber er hat es nicht separat geschrieben, sondern in routes/web.php:

Ein weiteres Beispiel beweist, dass Laravel sogar noch sehr persönlich ist Taylor, ich habe mich nicht zu 100 % an die Standards gehalten.


2. Gruppieren und strukturieren Sie die Datei „routes/web.php“

Das folgende Beispiel ist auch ein Beispiel aus der offiziellen Dokumentation von Laravel:

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // 使用 first 和 second 中间件
    });

    Route::get('user/profile', function () {
        // 使用 first 和 second 中间件
    });
});

Die grundlegendste Verwendung besteht darin, verschiedene Routengruppen in verschiedene Middleware einzubinden . Sie möchten beispielsweise, dass eine Gruppe standardmäßig durch die

auth-Middleware eingeschränkt wird, eine andere Gruppe durch eine separate admin-benutzerdefinierte Middleware usw.

Auf diese Weise können Sie auch Routing-Gruppierungsmethoden wie

Name und Präfix verwenden. Auch hier ist das Beispiel in der offiziellen Dokumentation angegeben:

Route::prefix('admin')->group(function () {
    Route::get('users', function () {
        // 匹配 URL 「/admin/users」
    });
});

Route::name('admin.')->group(function () {
    Route::get('users', function () {
        // 路由名为 「admin.users」...
    })->name('users');
});

Außerdem ist es einfacher zu verstehen, wenn Sie die gesamte Middleware + Name + Präfix zu einer Gruppe hinzufügen möchten, indem Sie sie in ein Array einfügen:

// 而不是这样做: 
Route::name('admin.')->prefix('admin')->middleware('admin')->group(function () {
    // ...
});

// 可以使用数组
Route::group([
    'name' => 'admin.', 
    'prefix' => 'admin', 
    'middleware' => 'auth'
], function () {
    // ...
});

Wir kombinieren es A Beispiel aus der Praxis mit drei Routengruppen:

    Gruppe „Gäste“ mit
  • /front/XXXXX URL und ohne Middleware
  • Mit
  • /user/XXXXX URL und auth Middleware „Benutzer“-Gruppe
  • „Admin " Gruppe
  • mit /admin/XXXXX URL und benutzerdefinierter
  • admin
Middleware

Hier sehen Sie, wie man alles in einer

routes/web.php
Datei gruppiert. Methode:

Route::group([
    'name' => 'admin.',
    'prefix' => 'admin',
    'middleware' => 'admin'
], function () {

    // URL链接:/admin/users
    // 路由名称:admin.users
    Route::get('users', function () {
        return 'Admin: user list';
    })->name('users');

});

Route::group([
    'name' => 'user.',
    'prefix' => 'user',
    'middleware' => 'auth'
], function () {

    // URL链接:/user/profile
    // 路由名称:user.profile
    Route::get('profile', function () {
        return 'User profile';
    })->name('profile');

});

Route::group([
    'name' => 'front.',
    'prefix' => 'front'
], function () {

    // 这里没有中间件
    // URL链接:/front/about-us
    // 路由名称:front.about
    Route::get('about-us', function () {
        return 'About us page';
    })->name('about');

});

3. Gruppieren Sie Controller mit Namespaces

Im obigen Beispiel haben wir keinen Controller verwendet und lediglich statischen Text als Beispiel zurückgegeben. Fügen wir einen Controller hinzu und machen Sie es uns etwas ausgefallener – wir strukturieren sie in Ordnern in ihren eigenen Namensräumen, etwa so:

Dann können wir sie in unseren Routendateien verwenden:

Route::group([
    'name' => 'front.',
    'prefix' => 'front'
], function () {
    Route::get('about-us', 'Front.boutController@index')->name('about');
});
Aber was ist, wenn wir viele haben? Controller in dieser Gruppe? Sollten wir weiterhin

Front.omeController
hinzufügen? Natürlich nicht. Sie können auch einen Namespace als einen der Parameter übergeben.

Route::group([
    'name' => 'front.',
    'prefix' => 'front',
    'namespace' => 'Front',
], function () {
    Route::get('about-us', 'AboutController@index')->name('about');
    Route::get('contact', 'ContactController@index')->name('contact');
});

4. Verschachtelte Gruppe

Die obige Situation ist in 3 Gruppen unterteilt. Tatsächlich ist die Struktur des tatsächlichen Projekts etwas anders – es gibt zwei Gruppen und auth. Dann gibt es innerhalb von auth zwei Untergruppen: user und admin. Dazu können wir in routes/web.php

Untergruppen erstellen und verschiedene Middlewares/Präfixe usw. zuweisen.

Route::group([
    'middleware' => 'auth',
], function() {

    Route::group([
        'name' => 'admin.',
        'prefix' => 'admin',
        'middleware' => 'admin'
    ], function () {

        // URL: /admin/users
        // Route name: admin.users
        Route::get('users', 'UserController@index')->name('users');

    });

    Route::group([
        'name' => 'user.',
        'prefix' => 'user',
    ], function () {

        // URL: /user/profile
        // Route name: user.profile
        Route::get('profile', 'ProfileController@index')->name('profile');

    });

});
Wir können sogar mehrere Verschachtelungsebenen haben, dies ist ein Beispiel aus einem Open-Source-Projekt. Akaunting

:

Route::group(['middleware' => 'language'], function () {
    Route::group(['middleware' => 'auth'], function () {
        Route::group(['prefix' => 'uploads'], function () {
            Route::get('{id}', 'Common.ploads@get');
            Route::get('{id}/show', 'Common.ploads@show');
            Route::get('{id}/download', 'Common.ploads@download');
        });

        Route::group(['middleware' => 'permission:read-admin-panel'], function () {
            Route::group(['prefix' => 'wizard'], function () {
                Route::get('/', 'Wizard.ompanies@edit')->name('wizard.index');

        // ...
Ein weiteres Beispiel stammt von einem anderen beliebten Laravel CRM namens Monica

:
Route::middleware(['auth', 'verified', 'mfa'])->group(function () {
    Route::name('dashboard.')->group(function () {
        Route::get('/dashboard', 'DashboardController@index')->name('index');
        Route::get('/dashboard/calls', 'DashboardController@calls');
        Route::get('/dashboard/notes', 'DashboardController@notes');
        Route::get('/dashboard/debts', 'DashboardController@debts');
        Route::get('/dashboard/tasks', 'DashboardController@tasks');
        Route::post('/dashboard/setTab', 'DashboardController@setTab');
    });

5. Globale Einstellungen in RouteServiceProvider

Es gibt eine Datei, die alle Routing-Einstellungen bereitstellt – app/Providers/RouteServiceProvider .php. Es verfügt über die Methode map()

, die zwei Routendateien bindet – Web und API: 🎜
    public function map()
    {
        $this->mapApiRoutes();
        $this->mapWebRoutes();
    }

    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    }

    protected function mapApiRoutes()
    {
        Route::prefix('api')
             ->middleware('api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
    }

您是否注意到方法中提及的 middleware, namespaceprefix ? 这是您可以为整个文件设置全局配置的地方,因此不必为文件中的每个路由组重复这些设置。

它主要用于 API 路由,因为它们的设置通常是相同的,如下所示:

protected function mapApiRoutes(){
    Route::group([
        'middleware' => ['api'],
        'namespace' => $this->namespace,
        'prefix' => 'api/v1',
    ], function ($router) {
        require base_path('routes/api.php');
    });}

上述方法将在所有 API URLs 的开头加上 api/v1/ 前缀。


6. 分组成更多文件 – 这值得吗?

如果您有大量的路由,并且希望将它们分组到单独的文件中,那么您可以使用上一节中提到的相同文件 – app/Providers/RouteServiceProvider.php。如果您仔细查看它的 map() 方法,您将在末尾看到注释位置:

public function map(){
    $this->mapApiRoutes();

    $this->mapWebRoutes();

    //}

如果愿意,您可以将其解释为添加更多文件的“邀请”。因此,您可以在此文件内创建另一个方法,例如 mapAdminRoutes(),然后将其添加到 map() 方法, 您的文件将被自动注册并加载。

但是,就我个人而言,我看不出这种方法有什么优势,而且我也没有经常看到这种做法。它会带来更多的路由分离,但有时您会迷失在那些文件中,不确定在哪里查找特定的路由。


7. 使用 Artisan route:list 命令查找特定路由

说到更大的路由并迷失在那里,我们有一个 Artisan 命令可以帮助定位某个路由。

您可能知道 php artisan route:list 将展示项目中的所有路由

但您知道还有更多的过滤功能来找到您想要的东西吗? 只需添加带参数的 –method,–name,–path

通过 method 过滤 – GET, POST 等:

按名称或 URL 部分过滤:


这就是我所能告诉的关于在大型项目中分组路由的全部内容。你还有其他例子吗?请在评论中分享。

原文地址:https://laraveldaily.com/how-to-structure-routes-in-large-laravel-projects/

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

更多编程相关知识,请访问:编程视频!!

Das obige ist der detaillierte Inhalt vonLassen Sie uns darüber sprechen, wie Sie das Routing in großen Laravel-Projekten organisieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen