Heim  >  Artikel  >  PHP-Framework  >  So organisieren Sie Ihr Routing in einem großen Laravel-Projekt

So organisieren Sie Ihr Routing in einem großen Laravel-Projekt

Guanhui
Guanhuinach vorne
2020-05-07 10:13:462498Durchsuche

Stellen Sie sich ein Laravel-Projekt mit über 100 Routen vor, einschließlich getrennter Module für Gäste, Benutzer, Administratoren usw. Wollen Sie wirklich alles in eine Datei schreiben? Wie gruppiert man sie und fügt der URL ein Präfix hinzu? Sehen wir uns an, welche Methoden 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:

routes/web.php

routes/api.php

Wenn Ihr Projekt also sowohl Frontend-Seiten als auch eine API (die Für weitere Verwendungsszenarien (Laiyueguang) fügen Sie bitte das API-Routing in api.php ein.

Wenn Sie beispielsweise die Seite /users und den Endpunkt /api/users/ haben, schreiben Sie diese in ihre eigenen Routing-Dateien, um Verwirrung zu vermeiden, die dadurch verursacht wird, dass derselbe Name in derselben Datei erscheint.

Aber ich habe kürzlich ein Gegenbeispiel aus dem offiziellen Laravel-Projekt gesehen. In Laravel Horizon verfügt Taylor nur über API-Routing, aber er hat es nicht separat geschrieben. Er hat es immer noch in Routen/web.php geschrieben:

So organisieren Sie Ihr Routing in einem großen Laravel-Projekt

Ein weiteres Beispiel beweist, dass Laravel es ist Immer noch sehr persönlich, selbst Taylor selbst folgte den Standards nicht zu 100 %.

2. Gruppieren Sie die Datei „routes/web.php“ in einer strukturierten Struktur

Das folgende Beispiel stammt ebenfalls aus der offiziellen Laravel-Dokumentation:

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

Die grundlegendste Verwendung besteht darin, verschiedene Routing-Gruppen in unterschiedliche Middleware einzubinden. Beispielsweise möchten Sie, dass eine Gruppe standardmäßig durch die Authentifizierungs-Middleware eingeschränkt wird, eine andere Gruppe durch eine separate benutzerdefinierte Admin-Middleware usw..

Auf diese Weise können Sie auch Routengruppierungsmethoden 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');
});

Wenn Sie außerdem die gesamte Middleware + Name + Präfix zu einer Gruppe hinzufügen möchten, ist es einfacher zu verstehen, wenn 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 haben dies zu einem realen Beispiel mit drei Routengruppen kombiniert:

Die Gruppe „Gast“ mit /front/XXXXX-URL und ohne Middleware

Mit / Gruppe „Benutzer“ mit user/XXXXX-URL und Authentifizierungs-Middleware

Gruppe „Administrator“ mit /admin/XXXXX-URL und benutzerdefinierter Admin-Middleware

So gruppieren Sie alles. Eine Möglichkeit in der Datei „routes/web.php“:

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 mithilfe von Namespaces

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

So organisieren Sie Ihr Routing in einem großen Laravel-Projekt

Dann können wir sie in Routing-Dateien verwenden:

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

Aber was wäre, wenn wir in dieser Gruppe viele Controller hätten? 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');
});

Gruppenverschachtelte Gruppe

Die obige Situation ist in 3 Gruppen unterteilt. Tatsächlich ist die Struktur des tatsächlichen Projekts etwas anders. – sind zwei Gruppen: front und auth. Dann gibt es innerhalb der Authentifizierung zwei Untergruppen: Benutzer und Administrator. 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, was ein Beispiel für ein Open-Source-Projekt ist. 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 aus 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 Bedient alle Routeneinstellungen – app/Providers/RouteServiceProvider.php. Es verfügt über eine map()-Methode, die zwei Routendateien – Web und API – bindet:

    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'));
    }

Haben Sie das in der Methode bemerkt? Und Middleware, Namespace und Präfix ? Hier können Sie globale Konfigurationen für die gesamte Datei festlegen, sodass Sie diese Einstellungen nicht für jede Routinggruppe in der Datei wiederholen müssen.

Es wird hauptsächlich für API-Routen verwendet, da deren Einstellungen normalerweise die gleichen sind wie unten gezeigt:

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

Die obige Methode stellt allen API-URLs am Anfang api/v1/ voran.

6. In mehrere Dateien gruppieren – lohnt es sich?

Wenn Sie eine große Anzahl von Routen haben und diese in separate Dateien gruppieren möchten, können Sie dieselbe Datei verwenden, die im vorherigen Abschnitt erwähnt wurde – app/Providers/RouteServiceProvider.php. Wenn Sie sich die Methode „map()“ genau ansehen, sehen Sie die Kommentarposition am Ende:

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

Sie können dies als „Einladung“ interpretieren, weitere Dateien hinzuzufügen, wenn Sie möchten. Sie können also in dieser Datei eine weitere Methode wie „mapAdminRoutes()“ erstellen und diese dann zur Methode „map()“ hinzufügen. Ihre Datei wird dann automatisch registriert und geladen.

Ich persönlich sehe jedoch keinen Vorteil in diesem Ansatz und sehe ihn auch nicht sehr oft. Dies würde zu einer stärkeren Trennung der Routen führen, aber manchmal verliert man sich in diesen Dateien und weiß nicht, wo man nach einer bestimmten Route suchen soll.

7. Finden Sie eine bestimmte Route mit dem Artisan-Befehl „route:list“

Apropos größere Routen und das Verirren darin: Wir haben einen Artisan-Befehl, der Ihnen beim Auffinden einer bestimmten Route helfen kann .

Sie wissen wahrscheinlich, dass PHP Artisan Route:List alle Routen in Ihrem Projekt anzeigt

So organisieren Sie Ihr Routing in einem großen Laravel-Projekt

Aber Sie wissen, dass es noch weitere Filterfunktionen gibt, um das zu finden, was Sie suchen Willst du etwas? Fügen Sie einfach –method, –name oder –path mit Argumenten hinzu.

Nach Methode filtern – GET, POST usw.:

So organisieren Sie Ihr Routing in einem großen Laravel-Projekt

Nach Name oder URL-Teil filtern:

So organisieren Sie Ihr Routing in einem großen Laravel-Projekt

Empfohlenes Tutorial: „Laravel

Das obige ist der detaillierte Inhalt vonSo organisieren Sie Ihr Routing in einem großen Laravel-Projekt. 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