LoginSignup
28
17

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-21

はじめに

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
17