こんにちは、さるまりんです。
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\UserController
のindex()
がpost
ではApi\UserController
のstore()
が呼び出されます。
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.php
のproviders
配列に登録します。
4. routes
ディレクトリを作成し、その配下に各機能(グループ)に対応するPHPファイルを配置します。この例ではroutes/api.php
、routes/admin.php
ファイルを配置します。
5. それぞれのファイルで以下の例のようにルートを定義します。
// routes/api.php
Route::get('/users', 'UserController@index');
Route::post('/users', 'UserController@store');
// routes/admin.php
Route::get('/dashboard', 'AdminController@index');
どんなふうに分けるかを検討し、うまく使うと読みやすく使いやすい定義ができると思います。
シンプルなのが一番わかりやすいですね。わかりやすさを大切に開発がんばります。
読んでくださってありがとうございました。
それではまた!