PHP
laravel

[Laravel5.5]Package Auto Discoveryを理解する

はじめに

2017年8月にLaravel5.5がリリースされました。
以前LaraLabというLaravel勉強会にて「Package Auto Discovery」に関してLTしたのでQiitaにも投稿してみます。

Package Auto Discoveryとは

Laravel5.5で導入された新しい仕組み。
直訳すると「パッケージの自動検出」ですが、ここでいうパッケージとは「Composerパッケージ」に該当します。
LaravelではServiceProviderやFacadeをサービスコンテナに登録をしますが、この機能を使用するとcomposer install (update)すると自動でロードしてくれます。

さらにcomposer remove時には自動でロードしなくなります。

この機能はアプリケーション側で無効にする事も可能ですが、使用するメリットが高いため無効にするケースはあまりないのではないでしょうか。

具体例でメリットを確認する

laravel-debugbarというプロファイラがあります。Laravelユーザーの方はご存知の方も多いのではないでしょうか。
laravel-debugbarはPackge Auto Discoveryに対応しているのですが、この機能を使用する前のインストール手順は以下のようになります。

  • composer require -dev laravel-debugbar
  • app.phpのprovider, aliasesキーにServiceProvider, Facadeを追加する
  • php artisan vendor:publishする

laravel5.5からは以下のようにcomposer requireした後、
php artisan vendor:publishするだけでインストールできます。

  • composer require -dev laravel-debugbar
  • app.phpのprovider, aliasesキーにServiceProvider, Facadeを追加する
  • php artisan vendor:publishする

※注 php artisan vendor:publishはlaraveldebugbarを使用するのに必要なコマンドであり、Package Auto Discoveryとは関係ありません

Package Auto Discoveryの仕組み

composer.json内の"extra":"laravel"フィールドにServiceProviderとFacadeが定義されています。

composer.json
{
    "extra": {
        "laravel": {
            "providers": [
                "Barryvdh\\Debugbar\\ServiceProvider"
            ],
            "aliases": {
                "Debugbar": "Barryvdh\\Debugbar\\Facade"
            }
        }
    }
}

composer install後に作成される、vendor/composer/installed.jsonがLaravel起動時にロードされ、
既存で読み込まれるServiceProviderFacadeの配列リストにマージされます。

Package Auto Discoveryを無効にしたい

アプリケーション側のcomposer.jsondont-disoverというフィールドがあります。
*をつけると全て無効になり、特定のpackageのみ無効にする場合はpackage名を付けて記述します。

composer.json
{
    "extra": {
        "laravel": {
             "dont-discover": [
                "barryvdh/laravel-debugbar"
            ]
        }
    }
}

まとめ

  • composerライブラリを使う際に、Package Auto Discoveryの仕組みを意識する必要は特にない
  • composer.jsonに"extra":"laravel"フィールドが存在しないライブラリには対応していないため、5.4までのようにServiceProvider, Facadeなどをapp.phpなどに追加する必要がある
  • 自身でcomposerライブラリをOSSとして提供する場合は、"extra":"laravel"フィールドを追加してあげるとユーザーフレンドリーになる