Laravel 5 – Ładowanie ServiceProvider w zależności od .env

Łukasz Piotrowski Komentarzy 0

    W trakcie naszej pracy napotkamy na różne sytuacje w których potrzebujemy zarejestrować jakiś Service Provider tylko w środowisku developerskim.
    Możemy dodać odpowiednie wpisy w config/app.php ale w przypadku braku na wersji produkcyjnej dostaniemy błąd.
    Taka sytuacja może dotyczyć paczek zainstalowanych z sekcji require-dev plikucomposer.json.

    Rozwiązanie bardzo proste i eleganckie które zaoszczędzi nam czasu i kłopotu.


    composer.json

    Wpierw musimy mieć jakąś paczkę którą chcemy załadować lokalnie.
    Dodajemy do composer.json do sekcji require-dev np:

    "barryvdh/laravel-debugbar": "2.0.*@dev"

    i robimy composer update

    Tworzymy ServiceProvider

    Tworzymy ServiceProvider odpowiedzialny za warunkowe rejestrowanie:

    php artisan make:provider LocalEnviromentServiceProvider

    Ładujemy go w pliku config/app.php

    'App\Providers\LocalEnviromentServiceProvider',

    Rejestrowanie własnych Service Provider

    Na początku dodajemy pole gdzie będziemy trzymać nasz wpisy:

        /**
         * List of Local Enviroment Providers
         * @var array
         */
        protected $localProviders = [
            'Barryvdh\Debugbar\ServiceProvider',
        ];

    oraz metodę do ich rejestrowania:

        /**
         * Loda local service providers
         */
        protected function registerServiceProviders()
        {
            foreach ($this->localProviders as $provider)
            {
                $this->app->register($provider);
            }
        }

    a na końcu do metody boot() dodajemy wywołanie:

        /**
         * Bootstrap the application services.
         * @return void
         */
        public function boot()
        {
            if ($this->app->isLocal())
            {
                $this->registerServiceProviders();
            }
        }

    Inne środowiska

    Jeśli chcemy ładować nasze wpisy w innych środowiskach niż local to zmieniamy

    $this->app->isLocal()

    na

    $this->app['env'] == 'local'
    // Lub
    $this->app->environment() == 'local'

    Dzięki temu załadujemy w dowolnym środowisku.

    Rejestrujemy Aliasy

    Zostały nam jeszcze do zarejestrowania Aliasy. To już wymaga odrobinę bardzie wymyślnej metody ale do dzieła.

    Tworzymy pole do trzymania aliasów:

        /**
         * List of only Local Enviroment Facade Aliases
         * @var array
         */
        protected $facadeAliases = [
            'Debugbar' => 'Barryvdh\Debugbar\Facade',
        ];

    Oraz metodę:

        /**
         * Load additional Aliases
         * Base file Alias load is /config/app.php => aliases
         */
        public function registerFacadeAliases()
        {
            $loader = AliasLoader::getInstance();
            foreach ($this->facadeAliases as $alias => $facade)
            {
                $loader->alias($alias, $facade);
            }
        }

    i na koniec dodajemy do naszej metody boot() wywołanie:

    $this->registerFacadeAliases();

    Finalna wersja ServiceProvider

    <?php namespace App\Providers;
    
    use Illuminate\Foundation\AliasLoader;
    use Illuminate\Support\ServiceProvider;
    
    class LocalEnviromentServiceProvider extends ServiceProvider
    {
    
        /**
         * List of Local Enviroment Providers
         * @var array
         */
        protected $localProviders = [
            'Barryvdh\Debugbar\ServiceProvider',
        ];
    
        /**
         * List of only Local Enviroment Facade Aliases
         * @var array
         */
        protected $facadeAliases = [
            'Debugbar' => 'Barryvdh\Debugbar\Facade',
        ];
    
        /**
         * Bootstrap the application services.
         * @return void
         */
        public function boot()
        {
            if ($this->app->isLocal()) {
                $this->registerServiceProviders();
    
                $this->registerFacadeAliases();
            }
        }
    
        /**
         * Register the application services.
         * @return void
         */
        public function register()
        {
        }
    
        /**
         * Load additional Aliases
         * Base file Alias load is /config/app.php => aliases
         */
        public function registerFacadeAliases()
        {
            $loader = AliasLoader::getInstance();
            foreach ($this->facadeAliases as $alias => $facade) {
                $loader->alias($alias, $facade);
            }
        }
    
        /**
         * Loda local service providers
         */
        protected function registerServiceProviders()
        {
            foreach ($this->localProviders as $provider) {
                $this->app->register($provider);
            }
        }
    }
    Top