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);
}
}
}