Laravelでproviderやaliasをenvで環境ごとに分ける方法

Laravel

providerやaliasを環境ごとに分けたい

Laravelでproviderやaliasを環境ごとに分けて使用したいことがあります。

こちら記事で紹介しているように、使用するライブラリをcomposerで開発・本番ごとに分けている場合は、Laravel側でも追加するproviderやaliasを環境ごとに設定しないと、追加されなかったライブラリ等を呼び出そうとしてエラーになってしまいます。

Laravel側での環境分けの設定もComposer側でも環境分けの設定もしっかりできるようにして、Laravelをマスターしていきましょう!

環境ごとにproviderやaliasを分ける方法

開発用のproviderとaliasの登録欄を追加する

以下のようにdev-providersをprovidersが定義してある次の要素として追加するとわかりやすいかと思います。

次にdev-aliasesをaliasesが定義してある次の要素として追加しましょう!

config/app.php

    // 本番環境でのみ必要なプロバイダー
    'providers' => [
    .
    .
    ],

    // 開発環境でのみ必要なプロバイダー
    'dev-providers' => [
        Laralib\L5scaffold\GeneratorsServiceProvider::class,
        .
        .
    ],

    // 本番環境でのみ必要なエイリアス
    'aliases' => [
    .
    .
    ],

    // 開発環境でのみ必要なエイリアス
    'dev-aliases' => [
        'Debugbar' => Barryvdh\Debugbar\Facade::class,
        .
        .
    ],

このように定義することで、以下のように本番・開発用ごとに必要なproviderとaliasを使い分けることができます。

  • providers = 本番環境用のプロバイダーを登録する
  • dev-providers = 開発環境用のプロバイダーを登録する
  • aliases = 本番環境用のエイリアスを登録する
  • dev-aliases = 開発環境用のエイリアスを登録する

ここでは、例として開発環境用のプロバイダーにL5scaffoldを開発環境用のエイリアスにLaravelのDebugbarを登録しています。

開発のみに必要な機能ですので、このように環境ごとに使い分けられると大変便利ですね!

ステージング環境などのproviderとaliasも分けて登録できるようにしたい

このような場合もやり方としては同じです。

config/app.phpstg-providersやstg-aliasesなどを作成してそこへ対象のプロバイダーやエイリアスを登録するようにしましょう!

色々と応用を効かせると、さらにLaravelを便利に使うことができます!

サービス起動時に環境毎のプロバイダーとエイリアスを登録する

次は先程config/app.phpへ定義したプロバイダーやエイリアスをサービス起動時に登録されるように設定していきます。

AppServiceProvider.phpのファイル内にAppServiceProviderクラスのboot()メゾットがありますので、こちらにプロバイダーの登録とエイリアスの登録を行う処理を追加します。

ServiceProviderAliasLoaderをuseする必要があるので忘れないようにしましょう!

app/Providers/AppServiceProvider.php

use Illuminate\Support\ServiceProvider;
use Illuminate\Foundation\AliasLoader;


class AppServiceProvider extends ServiceProvider
{


    public function boot()
    {
        // プロバイダーの登録
        $devProviders = $this->app->config->get('app.dev-providers');

        if ($this->app->environment() === 'local' && !empty($devProviders)) {
            foreach ($devProviders as $providerName) {
                $this->app->register($providerName);
            }
        }
        // エイリアスの登録
        $devAliases = $this->app->config->get('app.dev-aliases');
 
        $aliasLoader = AliasLoader::getInstance();
 
        if (!empty($devAliases)) {
            foreach ($devAliases as $alias => $className) {
                if ($this->app->environment() === 'local') {
                    $aliasLoader->alias($alias, $className);
                } else {
                    // Register stab class when it is not in local environment.
                    $aliasLoader->alias($alias, MethodCallHandler::class);
                }
            }
        }
    }


    public function register()
    {
        .
        .
    }
}

環境毎の切り替え方法

ここまでの設定が完了すると、.envファイルのAPP_ENVの値によって環境分けがされるようになります。

APP_ENV=localであれば

  • dev-providers内のプロバイダーが読み込まれる
  • dev-aliases内のエイリアスが読み込まれる

ようになります。

逆に、APP_ENV=productionであれば

  • dev-providers内のプロバイダーは読み込まれない
  • dev-aliases内のエイリアスは読み込まれない

と制御することができるのでうまく環境分けができるようになります!

また.envのデフォルト開発環境のlocalではなくdevelopmentに修正して、ローカル開発環境と分けて、わかりやすくカスタマイズしても良いですね。

その際は、同様のやり方で

  • config/app.phpへの環境の追加
  • app/Providers/AppServiceProvider.phpへ環境毎の設定の読み込み処理の追加
  • .envでの環境切り替え

を忘れないように注意してくださいね!

まとめ

いかがでしたでしょうか?

Laravelでproviderやaliasを環境ごとに分けられると大変便利ですので、是非本記事を参考にマスターしてください!

Laravel始めて間もない方は、Laravelの上達方法についても詳しく記事をまとめていますので見てみてくださいね!

Laravelの学習をこれから始めたい!という方は、Laravelの入門記事も書いていますので是非見て下さい!

Laravelでオススメな本を探している!という方は、こちらで僕がLaravelの書籍をまとめて感想を書いていますので購入の際の参考にしてください!

コメント