Skip to main content

パッケージとは

Laravelにおけるパッケージとは、アプリケーションに機能を追加するComposerパッケージです。パッケージには大きく2種類あります。
  • スタンドアロンパッケージ — Laravelに依存しない汎用PHPライブラリ(例:Carbon、Pest)
  • Laravelパッケージ — ルート、コントローラー、ビュー、設定など、Laravelと統合された機能を持つパッケージ
このガイドでは後者、Laravel専用パッケージの開発を扱います。パッケージ開発にはサービスプロバイダー、ファサード、設定ファイルの公開など、Laravelの内部構造を深く理解する必要があります。
パッケージのテストを書く場合は、Orchestra Testbench を使います。通常のLaravelアプリケーションと同じようにパッケージのテストを記述できます。

パッケージの自動検出

Laravelはパッケージをインストールした際に、composer.jsonextra.laravel セクションを読み取ってサービスプロバイダーとファサードを自動登録します。
この設定を加えると、ユーザーは bootstrap/providers.php を手動で編集しなくてもパッケージが自動的に読み込まれます。
この自動検出がどのように実装され、いつキャッシュが再構築されるのかはパッケージ自動検出の内部構造で詳しく解説しています。

自動検出を無効にする

ユーザー側で特定のパッケージの自動検出を無効にしたい場合は、アプリケーションの composer.json に設定します。

サービスプロバイダーの役割

サービスプロバイダーはパッケージのエントリポイントです。ビュー、設定、マイグレーション、ルートなどのリソースをLaravelに登録する処理をここに集約します。 サービスプロバイダーは Illuminate\Support\ServiceProvider を継承し、registerboot の2つのメソッドを持ちます。
register メソッド内でイベントリスナー、ルート、ビューなどを登録しないでください。まだ読み込まれていない別のサービスプロバイダーのサービスを誤って使ってしまう可能性があります。バインディング以外の処理は必ず boot メソッドで行います。

設定ファイルのPublish

publishes() — ファイルを公開する

boot メソッドで publishes() を呼び出すと、ユーザーが vendor:publish コマンドで設定ファイルを自分のアプリケーションにコピーできるようになります。
公開後の設定値は通常のconfigアクセスと同じ方法で取得できます。

mergeConfigFrom() — デフォルト値とマージする

register メソッドで mergeConfigFrom() を使うと、ユーザーが設定ファイルを公開していない場合にもパッケージのデフォルト値が使われます。
mergeConfigFrom() はネストした配列の深いレベルまではマージしません。多次元配列を持つ設定では、ユーザーが一部だけ定義した場合に残りのオプションがマージされないことがあります。

タグで公開グループを分ける

publishes() の第2引数にタグを指定すると、ユーザーが必要なリソースだけを選んで公開できます。

ルートの登録

loadRoutesFrom() を使ってルートファイルを読み込みます。アプリケーションのルートキャッシュが有効な場合は自動的にスキップされます。
ルートファイルではパッケージのコントローラーを指定します。

マイグレーションのPublish

publishesMigrations() を使うと、マイグレーションファイルを公開できます。公開時にLaravelが自動的にタイムスタンプを更新します。

ビューのPublish

loadViewsFrom() — ビューを登録する

loadViewsFrom() でビューディレクトリを登録します。第2引数の名前空間を使って package::view の形式でビューを参照します。
登録後、ビューはパッケージ名前空間で参照します。
Laravelはビューを2か所から探します。まずアプリケーションの resources/views/vendor/courier ディレクトリを確認し、なければパッケージのビューディレクトリを使います。これによりユーザーがビューをカスタマイズできます。

ビューを公開する

Bladeコンポーネントを登録する

コンポーネントをパッケージに含める場合は、boot メソッドで登録します。
コンポーネント名前空間を使って一括登録することもできます。

翻訳ファイルのPublish

loadTranslationsFrom() で翻訳ファイルを登録します。翻訳は package::file.key の形式で参照します。
JSONの翻訳ファイルを使う場合は loadJsonTranslationsFrom() を使います。

コマンドの登録

パッケージのArtisanコマンドは commands() メソッドで登録します。コンソール環境でのみ登録するのが一般的です。

optimize コマンドへの統合

パッケージが独自のキャッシュを持つ場合、optimizes() メソッドで php artisan optimizephp artisan optimize:clear に統合できます。

about コマンドへの情報追加

php artisan about の出力にパッケージ情報を追加するには AboutCommand::add() を使います。

ファサードの作成

ファサードを使うと、サービスコンテナのバインディングを静的メソッドのように呼び出せます。
1

サービスクラスを作成する

2

ファサードクラスを作成する

Illuminate\Support\Facades\Facade を継承し、getFacadeAccessor() でサービスコンテナのバインディングキーを返します。
3

サービスプロバイダーでバインドする

4

composer.json に登録する

ファサードのメソッドにはPHPDocの @method アノテーションを付けることで、IDEの補完が有効になります。

DeferrableProvider — 遅延読み込みの実装

サービスコンテナへのバインディングのみを行うプロバイダーは、DeferrableProvider インターフェースを実装することで遅延読み込みを実現できます。サービスが実際に必要になるまでプロバイダーが読み込まれないため、アプリケーションのパフォーマンスが向上します。
Laravelは遅延プロバイダーが提供するサービスのリストをコンパイルして保存します。provides() に列挙したサービスが解決されるときだけプロバイダーが読み込まれます。
リソースの登録(ビュー、ルート、イベントリスナーなど)が必要なプロバイダーには DeferrableProvider を使わないでください。遅延読み込みされると、それらのリソースが登録されないままになります。

パッケージのテスト

パッケージ単体でテストする場合は Orchestra Testbench を使います。通常のLaravelアプリケーション内にいるかのようにパッケージのテストを記述できます。
テストケースで getPackageProviders() をオーバーライドしてパッケージのサービスプロバイダーを登録します。

Composerへの公開

パッケージを Packagist に公開するためのベストプラクティスです。 composer.json の基本設定
illuminate/support に依存することで、illuminate/framework 全体ではなくLaravelの必要なコンポーネントだけを依存に含められます。パッケージの依存ツリーを小さく保ちましょう。
ディレクトリ構造の例

関連ページ

サービスプロバイダー

サービスプロバイダーの registerboot メソッド、遅延プロバイダーの詳細を確認します。

バージョン互換性管理

LaravelとPHPのメジャーバージョンアップへの対応戦略とGitHub Actionsのテストマトリクス設定を解説します。
最終更新日 2026年7月18日