Edited at

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

More than 1 year has passed since last update.


はじめに

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"フィールドを追加してあげるとユーザーフレンドリーになる