ホームページ > 記事 > PHPフレームワーク > 大規模な Laravel プロジェクトでルーティングを整理する方法について話しましょう
訪問者、ユーザー、管理者などのための個別のモジュールを含む、100 を超えるルートを持つ Laravel プロジェクトを想像してください。本当にすべてを 1 つのファイルに書き込みますか?では、それらをグループ化し、URL にプレフィックスを追加するにはどうすればよいでしょうか?利用可能なオプションを確認してください。
Laravel がすでに行っているため、これは簡単です。次の 2 つのファイルがあります:
したがって、プロジェクトにフロントエンド ページと API の両方がある場合 (使用シナリオはますます幅広くなっています)、API ルーティングを api.php に記述してください。 [関連する推奨事項: laravel ビデオ チュートリアル ]
たとえば、/users ページと /api/users/ エンドポイントがあるとします。 , 同じファイル内に同じ名前が出現することによる混乱を避けるために、これらを独自のルーティング ファイルに個別に記述します。
しかし、私は最近、Official Laravel プロジェクトの反例を目にしました。 Laravel Horizon では、Taylor には API ルートしかありませんが、それらを個別に記述せず、依然として routes/web.php :
に記述しています。
別の例は、Laravel が依然として非常に個人的なものであり、Taylor 自身ですら標準に 100% 準拠していないことを証明しています。
次の例は、Laravel 公式ドキュメント#の例でもあります。 ##:
Route::middleware(['first', 'second'])->group(function () { Route::get('/', function () { // 使用 first 和 second 中间件 }); Route::get('user/profile', function () { // 使用 first 和 second 中间件 }); });最も基本的な使用法は、異なるミドルウェアに異なるルーティング グループを含めることです。たとえば、あるグループをデフォルトで
auth ミドルウェアによって制限し、別のグループを別の admin カスタム ミドルウェアによって制限するなどします。
この方法では、name や prefix などのルート グループ化方法も使用できます。繰り返しますが、例は公式ドキュメントに記載されています:
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'); });また、すべてのミドルウェア名のプレフィックスをグループに追加する場合は、それらを配列に入れると理解しやすくなります:
// 而不是这样做: Route::name('admin.')->prefix('admin')->middleware('admin')->group(function () { // ... }); // 可以使用数组 Route::group([ 'name' => 'admin.', 'prefix' => 'admin', 'middleware' => 'auth' ], function () { // ... });これを 3 つのルート グループを含む実際の例に組み合わせてみましょう:
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'); });
Route::group([ 'name' => 'front.', 'prefix' => 'front' ], function () { Route::get('about-us', 'Front.boutController@index')->name('about'); });しかし、このグループに多くのコントローラーがある場合はどうなるでしょうか?
Front.omeController を追加し続ける必要がありますか?もちろん違います。パラメータの 1 つとして名前空間を渡すこともできます。
Route::group([ 'name' => 'front.', 'prefix' => 'front', 'namespace' => 'Front', ], function () { Route::get('about-us', 'AboutController@index')->name('about'); Route::get('contact', 'ContactController@index')->name('contact'); });
front と auth という 2 つのグループがあります。 auth 内には、user と admin という 2 つのサブグループがあります。これを行うには、routes/web.php にサブグループを作成し、異なるミドルウェア/プレフィックスなどを割り当てます。 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');
});
});
オープンソース プロジェクトの一例である、複数レベルのネストを作成することもできます。
)。これには、Web と API の map() という 2 つのルート ファイルがバインドされています。 ### 方法: ### 您是否注意到方法中提及的 middleware, namespace 和 prefix ? 这是您可以为整个文件设置全局配置的地方,因此不必为文件中的每个路由组重复这些设置。 它主要用于 API 路由,因为它们的设置通常是相同的,如下所示: 上述方法将在所有 API URLs 的开头加上 api/v1/ 前缀。 如果您有大量的路由,并且希望将它们分组到单独的文件中,那么您可以使用上一节中提到的相同文件 – app/Providers/RouteServiceProvider.php。如果您仔细查看它的 map() 方法,您将在末尾看到注释位置: 如果愿意,您可以将其解释为添加更多文件的“邀请”。因此,您可以在此文件内创建另一个方法,例如 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 更多编程相关知识,请访问:编程视频!! 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'));
}
protected function mapApiRoutes(){
Route::group([
'middleware' => ['api'],
'namespace' => $this->namespace,
'prefix' => 'api/v1',
], function ($router) {
require base_path('routes/api.php');
});}
6. 分组成更多文件 – 这值得吗?
public function map(){
$this->mapApiRoutes();
$this->mapWebRoutes();
//}
7. 使用 Artisan route:list 命令查找特定路由
以上が大規模な Laravel プロジェクトでルーティングを整理する方法について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。