ホームページ  >  記事  >  PHPフレームワーク  >  大規模な Laravel プロジェクトでルーティングを整理する方法

大規模な Laravel プロジェクトでルーティングを整理する方法

Guanhui
Guanhui転載
2020-05-07 10:13:462488ブラウズ

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

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

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

routes/web.php

routes/api.php

したがって、プロジェクトにフロントエンド ページと API の両方がある場合は、 (使用シナリオ (Laiyueguang) が多い場合は、API ルーティングを api.php に記述してください。

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

しかし、私は最近、公式の Laravel プロジェクトからの反例を見ました。 Laravel Horizo​​n では、Taylor は API ルーティングのみを持っていますが、それを個別に記述したわけではなく、依然として Router/web.php に記述しました:

大規模な Laravel プロジェクトでルーティングを整理する方法

別の例は、Laravel が次のことを証明しています。依然として非常に個人的なものであり、テイラー自身でさえ基準に100%従っていませんでした。

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

次の例も Laravel の公式ドキュメントからのものです:

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

The最も基本的な使用法は、異なるミドルウェアに異なるルーティング グループを含めることです。たとえば、あるグループをデフォルトで認証ミドルウェアによって制限し、別のグループを別の管理カスタム ミドルウェアによって制限するなどします。

このように、名前やプレフィックスなどのルート グループ化方法も使用できます。繰り返しますが、例は公式ドキュメントに記載されています:

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

/front/XXXXX URL を持つ「guest」グループ、ミドルウェアなし

/user/ XXXXX URL を持つ「Users」グループおよび認証ミドルウェア

/admin/XXXXX URL とカスタム管理ミドルウェアを持つ「管理者」グループ

すべてをルートにグループ化する方法は次のとおりです / 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. 名前空間を使用したグループ コントローラー

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

大規模な Laravel プロジェクトでルーティングを整理する方法

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

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 つのグループに分けられていますが、実際には簡略化されており、実際のプロジェクトの構造は少し異なります。 – は、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');
    });
});

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

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

別の例は、Monica と呼ばれる別の人気のある Laravel CRM からのものです:

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. RouteServiceProvider のグローバル設定

ファイルがあります。すべてのルーティング設定を提供します – app/Providers/RouteServiceProvider.php. これには、Web と API の 2 つのルーティング ファイルをバインドする map() メソッドがあります:

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

メソッドとミドルウェア、名前空間、およびプレフィックスにあることに気づきましたか? ?ここでファイル全体のグローバル構成を設定できるため、ファイル内のルーティング グループごとにこれらの設定を繰り返す必要はありません。

これは、以下に示すように、設定が通常同じであるため、主に API ルーティングに使用されます。

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

上記のメソッドは、すべての API URL の先頭に api/v1/ というプレフィックスを付けます。

6. より多くのファイルにグループ化する – それだけの価値はありますか?

多数のルートがあり、それらを別のファイルにグループ化したい場合は、前のセクションで説明したのと同じファイル app/Providers/RouteServiceProvider.php を使用できます。その map() メソッドをよく見ると、最後にコメントの位置が表示されます:

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

必要に応じて、これをファイルを追加するための「招待」として解釈できます。したがって、このファイル内に、mapAdminRoutes() などの別のメソッドを作成し、それを map() メソッドに追加すると、ファイルが自動的に登録され、ロードされます。

しかし、個人的には、このアプローチには何の利点も見当たりませんし、あまり頻繁に行われていることも見ません。これにより、ルーティングがさらに分離されますが、場合によっては、これらのファイルの中で道に迷ってしまい、特定のルートをどこで探せばよいのか分からなくなることがあります。

7. アーティザン ルート:リスト コマンドを使用して特定のルートを検索します

より大きなルートで道に迷った場合について言えば、特定のルートを見つけるのに役立つアーティザン コマンドがあります。 。

おそらく php 職人のルート:リストがプロジェクト内のすべてのルートを表示することはご存知でしょう

大規模な Laravel プロジェクトでルーティングを整理する方法

しかし、必要なものを見つけるためのさらに多くのフィルタリング機能があることはご存知でしょう。欲しいものがありますか? –method、または –name、または –path を引数とともに追加するだけです。

メソッドによるフィルター – GET、POST など:

大規模な Laravel プロジェクトでルーティングを整理する方法

名前または URL 部分によるフィルター:

大規模な Laravel プロジェクトでルーティングを整理する方法

##推奨チュートリアル: 「

Laravel

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

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