はじめに
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が定義されています。
{
"extra": {
"laravel": {
"providers": [
"Barryvdh\\Debugbar\\ServiceProvider"
],
"aliases": {
"Debugbar": "Barryvdh\\Debugbar\\Facade"
}
}
}
}
composer install後に作成される、vendor/composer/installed.json
がLaravel起動時にロードされ、
既存で読み込まれるServiceProvider
とFacade
の配列リストにマージされます。
Package Auto Discoveryを無効にしたい
アプリケーション側のcomposer.json
にdont-disover
というフィールドがあります。
*
をつけると全て無効になり、特定のpackageのみ無効にする場合はpackage名を付けて記述します。
{
"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"**フィールドを追加してあげるとユーザーフレンドリーになる