LaravelでURL、routesをまとめる方法

こんにちは、さるまりんです。

Laravelで開発している時、ルート、URLをグループでまとめたい時があります。

まずはルートグループです。
複数のルートに対して共通のミドルウェアなどを一括で定義するときに使います。

Route::group(['middleware' => 'auth'], function () {
    Route::get('/profile', 'ProfileController@index');
    Route::get('/settings', 'SettingsController@index');
});

上の例では、/profile/settingsの両方にauthのミドルウェアを適用します。

次はルートプレフィックスです。
ルートのURLに共通のプレフィックスを追加します。

Route::prefix('admin')->group(function () {
    Route::get('/users', 'Admin\UserController@index');
    Route::get('/posts', 'Admin\PostController@index');
});

この例では、/admin/users/admin/postsというURLが作られます。
URLをグループでまとめるというとこのイメージが多いかもしれないですね。

ルートグループとルートプレフィックスは組み合わせて使うことができます。

Route::prefix('api')->middleware('api')->group(function () {
    Route::get('/users', 'Api\UserController@index');
    Route::post('/users', 'Api\UserController@store');
});

/api/usersというURLに、apiミドルウェアが適用される、getではApi\UserControllerindex()postではApi\UserControllerstore()が呼び出されます。

1つのファイルでルートを定義しているとファイルが巨大になることがあります。
そういう時はグールプ別でファイルを分けます。

その方法です。

1. コマンドphp artisan make:provider RoutesServiceProvierを実行し、RouteServiceProviderを作ります。
2. bootメソッド内でRouteファサードを使ってルートを定義します。

// app/Providers/RouteServiceProvider.php
namespace App\Providers;

use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;

class RouteServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Route::group(['prefix' => 'api'], function () {
            // APIルート
            require base_path('routes/api.php');
        });

        Route::group(['prefix' => 'admin'], function () {
            // 管理者用ルート
            require base_path('routes/admin.php');
        });
    }
}

3. 作成したサービスプロバイダーをconfig/app.phpproviders配列に登録します。

4. routesディレクトリを作成し、その配下に各機能(グループ)に対応するPHPファイルを配置します。この例ではroutes/api.phproutes/admin.phpファイルを配置します。

5. それぞれのファイルで以下の例のようにルートを定義します。

// routes/api.php
Route::get('/users', 'UserController@index');
Route::post('/users', 'UserController@store');

// routes/admin.php
Route::get('/dashboard', 'AdminController@index');

どんなふうに分けるかを検討し、うまく使うと読みやすく使いやすい定義ができると思います。
シンプルなのが一番わかりやすいですね。わかりやすさを大切に開発がんばります。

読んでくださってありがとうございました。
それではまた!