13.x、フレームワークの実装は最新リリースの v13.34.0 を参照しています。
loadRoutesFromはファイルを読み込むだけ
ServiceProvider::loadRoutesFrom() は、アプリケーションが CachesRoutes を実装し、routesAreCached() が真の場合にはルートファイルを読み込みません。それ以外の場合は、指定ファイルを require します。
このメソッド自体は、URIやルート名のプレフィックス、コントローラーの名前空間、ミドルウェアを追加しません。ファイルの公開や、既存キャッシュへのルートの追加も行いません。
図は標準のLaravelアプリケーションを前提にしています。パッケージ専用のキャッシュがあるのではなく、アプリケーション全体のルートキャッシュにパッケージのルートも含まれます。
設定と登録を分ける
次の例では、パッケージが応答可能かを返す公開エンドポイントを作ります。ComposerのPSR-4でAcme\Courier\ を src/ へ対応させ、プロバイダーを自動検出または手動登録していることを前提にします。
config/courier.php
register()、ルートの読み込みは boot() で行います。HTTPルートを登録するプロバイダーを DeferrableProvider にしないでください。ルートが必要な時点でプロバイダーが起動する保証がなくなるためです。
src/CourierServiceProvider.php
routes/web.php
src/Http/Controllers/StatusController.php
/acme-courier/status、ルート名は acme-courier.status です。route('acme-courier.status') でURLを生成すれば、URIのプレフィックスを変更しても呼び出し側は同じルート名を使えます。グループの name() は文字列をそのまま連結するため、末尾の . も指定します。
web は認証・認可の代わりではありません。この例は機密情報を含まない公開エンドポイントです。利用者のデータを返すエンドポイントには、仕様に応じた認証ミドルウェアと認可処理を別途設けてください。URIとルート名の衝突を別々に防ぐ
URIのプレフィックスとルート名のプレフィックスは別の仕組みです。片方を付けただけでは、もう片方の衝突を防げません。AbstractRouteCollection はキャッシュ用のルートコレクションを作る際、別のルートに同じ名前が付いていると LogicException を投げる処理を持ちます。「通常起動でURLを生成できた」だけではキャッシュ可能であることを保証できません。URIが異なる2つのルートでも、名前が同じなら問題になります。
利用アプリケーションのルートを登録順序で上書きすることを、パッケージの拡張方法にしないでください。必要ならルートを無効にする設定と、利用者が別ルートから呼び出せるサービスを提供します。
キャッシュ作成時の設定がルート定義に残る
RouteCacheCommand は、まず route:clear を実行し、新しいアプリケーションを起動してルートを収集します。そのルートをシリアライズできる形に準備し、コンパイル結果をキャッシュファイルへ書き込みます。
このときパッケージのルートファイルも読み込まれるため、プレフィックスや登録の有無はキャッシュ作成時の設定で決まります。以降の起動では loadRoutesFrom() がファイルを読み込まず、キャッシュされたルートが使われます。
ユーザーやテナントなど、リクエストごとに変わる条件でルートを登録しないでください。その条件はキャッシュ作成時のCLI環境で評価されます。ルートは安定した構成で登録し、アクセスの可否はミドルウェアやコントローラー内の認可で判断します。
デプロイでは設定を先に確定する
コードと設定の更新を済ませてから、設定キャッシュを利用する構成では次の順序で再作成します。利用アプリケーションのデプロイ処理に組み込んでください。route:cache を実行すると、ルートも古い設定で作られます。config:cache だけを再実行しても、ルートキャッシュは更新されません。-vv でミドルウェアグループの内容も確認できます。
開発中にキャッシュなしで動作を確認する場合は、必要に応じて両方をクリアします。
リリース前に確認する組み合わせ
パッケージのテストに加え、Laravel 13の利用アプリケーションで次の組み合わせを確認します。インメモリのルート登録だけでなく、Artisanが新しいアプリケーションを起動する経路も対象にします。- キャッシュなしで
/acme-courier/statusが応答し、ルート名とミドルウェアが想定どおりである。 route:cacheが成功し、新しい起動でも同じURI・ルート名で応答する。- プレフィックスを変更してキャッシュを再作成すると、新しいURIが応答し、旧URIのパッケージルートがなくなる。
- 無効化してキャッシュを再作成すると、
route:list --name=acme-courierに対象ルートが出ない。 - 利用アプリケーションや他のパッケージと、URI・ルート名が衝突しない。
関連ページ
ルーティング
ルートグループ、名前付きルート、一覧表示の基本を確認します。
パッケージ設定のマージとキャッシュ
公開済み設定と設定キャッシュを考慮した更新手順を確認します。
遅延サービスプロバイダー
ルートを登録するプロバイダーを遅延させない理由を確認します。
パッケージのバージョン互換性管理
公開APIの変更をリリース方針と継続検証に結び付けます。