パッケージとは
Laravelにおけるパッケージとは、アプリケーションに機能を追加するComposerパッケージです。パッケージには大きく2種類あります。- スタンドアロンパッケージ — Laravelに依存しない汎用PHPライブラリ(例:Carbon、Pest)
- Laravelパッケージ — ルート、コントローラー、ビュー、設定など、Laravelと統合された機能を持つパッケージ
パッケージのテストを書く場合は、Orchestra Testbench を使います。通常のLaravelアプリケーションと同じようにパッケージのテストを記述できます。
パッケージの自動検出
Laravelはパッケージをインストールした際に、composer.json の extra.laravel セクションを読み取ってサービスプロバイダーとファサードを自動登録します。
bootstrap/providers.php を手動で編集しなくてもパッケージが自動的に読み込まれます。
この自動検出がどのように実装され、いつキャッシュが再構築されるのかはパッケージ自動検出の内部構造で詳しく解説しています。
自動検出を無効にする
ユーザー側で特定のパッケージの自動検出を無効にしたい場合は、アプリケーションのcomposer.json に設定します。
サービスプロバイダーの役割
サービスプロバイダーはパッケージのエントリポイントです。ビュー、設定、マイグレーション、ルートなどのリソースをLaravelに登録する処理をここに集約します。 サービスプロバイダーはIlluminate\Support\ServiceProvider を継承し、register と boot の2つのメソッドを持ちます。
callAfterResolving() の実行タイミングと、重複適用に耐える設計を解説しています。
Octaneやキューワーカーでも状態を持ち越さない登録方法は、パッケージサービスのライフサイクル設計を参照してください。scoped() の内部実装と、singletonが保持する依存関係の注意点を解説しています。
パッケージのHTTP機能へミドルウェアを追加する方法は、パッケージのミドルウェア登録と適用範囲を参照してください。エイリアスの登録とルートへの適用を分離し、利用アプリケーションの既存グループを上書きしない設計を解説しています。
設定ファイルのPublish
publishes() — ファイルを公開する
boot メソッドで publishes() を呼び出すと、ユーザーが vendor:publish コマンドで設定ファイルを自分のアプリケーションにコピーできるようになります。
mergeConfigFrom() — デフォルト値とマージする
register メソッドで mergeConfigFrom() を使うと、ユーザーが設定ファイルを公開していない場合にもパッケージのデフォルト値が使われます。
タグで公開グループを分ける
publishes() の第2引数にタグを指定すると、ユーザーが必要なリソースだけを選んで公開できます。
ルートの登録
loadRoutesFrom() を使ってルートファイルを読み込みます。アプリケーションのルートキャッシュが有効な場合は自動的にスキップされます。
マイグレーションのPublish
publishesMigrations() を使うと、マイグレーションファイルを公開対象に登録できます。Laravel 13の標準構成では、database.migrations.update_date_on_publish が有効なため、公開時にファイル名のタイムスタンプが更新されます。設定が無効または存在しない場合は、この更新は行われません。
ビューのPublish
loadViewsFrom() — ビューを登録する
loadViewsFrom() でビューディレクトリを登録します。第2引数の名前空間を使って package::view の形式でビューを参照します。
resources/views/vendor/courier ディレクトリを確認し、なければパッケージのビューディレクトリを使います。これによりユーザーがビューをカスタマイズできます。
実装上の検索順序とファイル単位のフォールバック、公開済みテンプレートへの変更の届け方、Bladeキャッシュとの違いはパッケージビューの上書きと更新で解説しています。
ビューを公開する
Bladeコンポーネントを登録する
コンポーネントをパッケージに含める場合は、boot メソッドで登録します。
公開アセットの配布
パッケージのJavaScript・CSS・画像を配布するには、publishes() で public_path('vendor/courier') などへのコピーを登録します。パッケージを更新しても公開済みファイルは自動では変わりません。
タグとプロバイダーによる対象の絞り込み、--force と --existing の違い、削除済みファイルの扱い、laravel-assets による更新はパッケージの公開アセットと更新で解説しています。
翻訳ファイルのPublish
loadTranslationsFrom() で翻訳ファイルを登録します。翻訳は package::file.key の形式で参照します。
loadJsonTranslationsFrom() を使います。
コマンドの登録
パッケージのArtisanコマンドはcommands() メソッドで登録します。コンソール環境でのみ登録するのが一般的です。
optimize コマンドへの統合
パッケージが独自のキャッシュを持つ場合、optimizes() メソッドで php artisan optimize と php artisan optimize:clear に統合できます。
--except による除外、標準タスクとの実行順序、失敗時の終了コードはパッケージのキャッシュとoptimizeへの統合で解説しています。
about コマンドへの情報追加
php artisan about の出力にパッケージ情報を追加するには AboutCommand::add() を使います。
--only とJSON出力、秘密情報を含めない設計、テストでの登録状態はパッケージの診断情報をaboutに追加するで解説しています。
ファサードの作成
ファサードを使うと、サービスコンテナのバインディングを静的メソッドのように呼び出せます。1
サービスクラスを作成する
2
ファサードクラスを作成する
Illuminate\Support\Facades\Facade を継承し、getFacadeAccessor() でサービスコンテナのバインディングキーを返します。3
サービスプロバイダーでバインドする
4
composer.json に登録する
@method アノテーションを付けることで、IDEの補完が有効になります。
DeferrableProvider — 遅延読み込みの実装
サービスコンテナへのバインディングのみを行うプロバイダーは、DeferrableProvider インターフェースを実装することで遅延読み込みを実現できます。サービスが実際に必要になるまでプロバイダーが読み込まれないため、アプリケーションのパフォーマンスが向上します。
provides() に列挙したサービスが解決されるときだけプロバイダーが読み込まれます。
パッケージのテスト
パッケージ単体でテストする場合は Orchestra Testbench を使います。通常のLaravelアプリケーション内にいるかのようにパッケージのテストを記述できます。getPackageProviders() をオーバーライドしてパッケージのサービスプロバイダーを登録します。
Composerへの公開
パッケージを Packagist に公開するためのベストプラクティスです。composer.json の基本設定
関連ページ
サービスプロバイダー
サービスプロバイダーの
register と boot メソッド、遅延プロバイダーの詳細を確認します。バージョン互換性管理
LaravelとPHPのメジャーバージョンアップへの対応戦略とGitHub Actionsのテストマトリクス設定を解説します。