Heim > Artikel > PHP-Framework > 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.
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.
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 wieName 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:
Hier sehen Sie, wie man alles in einer
routes/web.phpRoute::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'); });
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
Route::group([ 'name' => 'front.', 'prefix' => 'front', 'namespace' => 'Front', ], function () { Route::get('about-us', 'AboutController@index')->name('about'); Route::get('contact', 'ContactController@index')->name('contact'); });
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'); });
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, namespace 和 prefix ? 这是您可以为整个文件设置全局配置的地方,因此不必为文件中的每个路由组重复这些设置。
它主要用于 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/ 前缀。
如果您有大量的路由,并且希望将它们分组到单独的文件中,那么您可以使用上一节中提到的相同文件 – app/Providers/RouteServiceProvider.php。如果您仔细查看它的 map() 方法,您将在末尾看到注释位置:
public function map(){ $this->mapApiRoutes(); $this->mapWebRoutes(); //}
如果愿意,您可以将其解释为添加更多文件的“邀请”。因此,您可以在此文件内创建另一个方法,例如 mapAdminRoutes(),然后将其添加到 map() 方法, 您的文件将被自动注册并加载。
但是,就我个人而言,我看不出这种方法有什么优势,而且我也没有经常看到这种做法。它会带来更多的路由分离,但有时您会迷失在那些文件中,不确定在哪里查找特定的路由。
说到更大的路由并迷失在那里,我们有一个 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!