パッケージとは
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つのメソッドを持ちます。
設定ファイルのPublish
publishes() — ファイルを公開する
boot メソッドで publishes() を呼び出すと、ユーザーが vendor:publish コマンドで設定ファイルを自分のアプリケーションにコピーできるようになります。
mergeConfigFrom() — デフォルト値とマージする
register メソッドで mergeConfigFrom() を使うと、ユーザーが設定ファイルを公開していない場合にもパッケージのデフォルト値が使われます。
タグで公開グループを分ける
publishes() の第2引数にタグを指定すると、ユーザーが必要なリソースだけを選んで公開できます。
ルートの登録
loadRoutesFrom() を使ってルートファイルを読み込みます。アプリケーションのルートキャッシュが有効な場合は自動的にスキップされます。
マイグレーションのPublish
publishesMigrations() を使うと、マイグレーションファイルを公開できます。公開時にLaravelが自動的にタイムスタンプを更新します。
ビューのPublish
loadViewsFrom() — ビューを登録する
loadViewsFrom() でビューディレクトリを登録します。第2引数の名前空間を使って package::view の形式でビューを参照します。
resources/views/vendor/courier ディレクトリを確認し、なければパッケージのビューディレクトリを使います。これによりユーザーがビューをカスタマイズできます。
ビューを公開する
Bladeコンポーネントを登録する
コンポーネントをパッケージに含める場合は、boot メソッドで登録します。
翻訳ファイルのPublish
loadTranslationsFrom() で翻訳ファイルを登録します。翻訳は package::file.key の形式で参照します。
loadJsonTranslationsFrom() を使います。
コマンドの登録
パッケージのArtisanコマンドはcommands() メソッドで登録します。コンソール環境でのみ登録するのが一般的です。
optimize コマンドへの統合
パッケージが独自のキャッシュを持つ場合、optimizes() メソッドで php artisan optimize と php artisan optimize:clear に統合できます。
about コマンドへの情報追加
php artisan about の出力にパッケージ情報を追加するには AboutCommand::add() を使います。
ファサードの作成
ファサードを使うと、サービスコンテナのバインディングを静的メソッドのように呼び出せます。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のテストマトリクス設定を解説します。