kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

laravelのrouteファイルを分割

laravelでwebを作成しているとroutesのファイルが機能が増えるごとに肥大化していって読みづらくなったため、どうにか分割できないか模索して対策した結果です。

ファイル構成

routes
|- web.php
|- webManage.php
|- webUser.php

routesに用意するファイルは呼び出しファイルと分割した内容を用意します。

呼び出しファイルの内容

Route::prefix('admin')->group(function () {
        require('webManage.php');
});

Route::prefix('user')->group(function () {
        require('webUser.php');
});

分割したファイルの内容

Route::group(['prefix' => 'user'], function () {
    Route::get('search', [UserController::class, 'search'])->name('manage.user.search');
    Route::post('store', [UserController::class, 'store'])->name('manage.user.store');
    Route::post('delete', [UserController::class, 'delete'])->name('manage.user.delete');
});

Route::group(['prefix' => 'user'], function () {
    Route::post('login', [UserController::class, 'login'])->name('user.user.login');
    Route::get('me', [UserController::class, 'me'])->name('user.user.me');
});

結論として,requireで呼び出してしまえば動作するっぽいです。ドキュメントにも載っていないため正しいのか分からないので、参考にする場合は注意して使用してください。

require_onceではなくrequireの理由

初期はrequire_onceを使用していましたが、phpunitでテストコードを書いているときに毎回エラーになり、原因を調べていると一度だけは動作するという結果になりました。

webの動作としてアクセスごとに処理が行われるため、require_onceで大丈夫でしたがテストコードを書いた場合はroutesの処理が一度のみ行われテストのwebアクセスごとにはroutesの処理がされていないことになっているっぽく、requireで書くようにしました。

cacheはきかないはず

routesのキャッシュは、無名関数での呼び出しにした時点でcacheがうまく効かないらしく、たぶんこの方法で分割した場合もcacheはたぶん効かないと思われます。

コードが読みづらすぎるため、このあたりは遅く感じたら考えようと思います。

まとめ

機能が増えるごとにroutesのファイルが読みづらくなり、探すのに時間がかかるようになりかなり面倒になったため分割をしてみました。

検索しても該当内容が見つからなかったため、妥当なやり方かわかりませんが、個人的には便利だと思っています。