ホームページ  >  記事  >  PHPフレームワーク  >  大規模な Laravel プロジェクトでルーティングを整理する方法について話しましょう

大規模な Laravel プロジェクトでルーティングを整理する方法について話しましょう

青灯夜游
青灯夜游転載
2022-12-14 20:32:261720ブラウズ

大規模な Laravel プロジェクトでルーティングを整理する方法について話しましょう

訪問者、ユーザー、管理者などのための個別のモジュールを含む、100 を超えるルートを持つ Laravel プロジェクトを想像してください。本当にすべてを 1 つのファイルに書き込みますか?では、それらをグループ化し、URL にプレフィックスを追加するにはどうすればよいでしょうか?利用可能なオプションを確認してください。


1. WEB ルーティングと API ルーティングを分離する

Laravel がすでに行っているため、これは簡単です。次の 2 つのファイルがあります:

したがって、プロジェクトにフロントエンド ページと API の両方がある場合 (使用シナリオはますます幅広くなっています)、API ルーティングを api.php に記述してください。 [関連する推奨事項: laravel ビデオ チュートリアル ]

たとえば、/users ページと /api/users/ エンドポイントがあるとします。 , 同じファイル内に同じ名前が出現することによる混乱を避けるために、これらを独自のルーティング ファイルに個別に記述します。

しかし、私は最近、Official Laravel プロジェクトの反例を目にしました。 Laravel Horizo​​n では、Taylor には API ルートしかありませんが、それらを個別に記述せず、依然として routes/web.php :

に記述しています。

別の例は、Laravel が依然として非常に個人的なものであり、Taylor 自身ですら標準に 100% 準拠していないことを証明しています。


2.routes/web.php ファイルを構造化した構造にグループ化します

次の例は、Laravel 公式ドキュメント#の例でもあります。 ##:

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

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

最も基本的な使用法は、異なるミドルウェアに異なるルーティング グループを含めることです。たとえば、あるグループをデフォルトで

auth ミドルウェアによって制限し、別のグループを別の admin カスタム ミドルウェアによって制限するなどします。

この方法では、

nameprefix などのルート グループ化方法も使用できます。繰り返しますが、例は公式ドキュメントに記載されています:

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 つのルート グループを含む実際の例に組み合わせてみましょう:

    URL が
  • /front/XXXXX でミドルウェアなしの「Guests」グループ
  • User
  • /user/XXXXX URL と auth ミドルウェアを含むグループ
  • /
  • /admin/XXXXX URL とカスタム admin ミドルウェアを含む「管理者」グループ
すべてを

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. グループ名前空間を使用するコントローラ

上記の例では、コントローラを使用せず、例として静的テキストを返しただけです。コントローラーを追加して、少し工夫してみます。次のように、コントローラーを独自の異なる名前空間内のフォルダーに構造化します。

それから、ルーティング ファイルで使用できます。

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


4. グループのネストされたグループ

上記の状況を 3 つのグループに分けますが、実際にはこれを簡略化しています。異なります –

frontauth という 2 つのグループがあります。 auth 内には、useradmin という 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');

    });

});
オープンソース プロジェクトの一例である、複数レベルのネストを作成することもできます。

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

        // ...
もう 1 つの例は、

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 という別の人気のある Laravel CRM からのものです。 RouteServiceProvider

すべてのルート設定を提供するファイルが 1 つあります (

app/Providers/RouteServiceProvider.php

)。これには、Web と API の map() という 2 つのルート ファイルがバインドされています。 ### 方法: ###

    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

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

以上が大規模な Laravel プロジェクトでルーティングを整理する方法について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。