Qualche giorno fa mi sono ritrovato a dover gestire una serie di package da usare solo in locale. Mi sono chiesto: esiste un modo di fare le cose pulito, a riguardo? Ho così chiesto (e ricevuto risposte) su Stackoverflow. Riassumerò qui quello che ho scoperto.
La maggior parte dei package, infatti, ti invita a inserire il proprio ServiceProvider
e l’eventuale Facade
all’interno del file config/app.php
ma non sempre è una best practice.
Molto spesso ti sarà capitato di voler inserire all’interno di un progetto alcuni package che sono utili soltanto nella fase di sviluppo e che non sono richiesti nell’ambiente di produzione, alcuni esempi possono essere IDE Helper, oppure DebugBar, entrambi utilissimi quando sviluppi ma poco importanti quando il tuo progetto è online.
Allora, perchè non fare in modo che questi ServiceProvider e Facade non siano disponibili solo quando il tuo environment è impostato su local
?
In questo tutorial a step vedremo come fare a installare i package citati sopra e a preparare un ambiente locale facilmente mantenibile.
Primo Step – composer.json
Il file composer.json
ha una sezione apposita adibita ai package per lo sviluppo, sezione identificata con require-dev
che per default include phpunit
e phpspec
, due package utili per eseguire test.
Assicurati quindi di inserire in questa sezione i packege di sviluppo:
“barryvdh/laravel-ide-helper”: “~2”,
“barryvdh/laravel-debugbar”: “~2.0”
Dovresti avere una cosa simile alla seguente:
“require-dev”: {
“phpunit/phpunit”: “~4.0”,
“phpspec/phpspec”: “~2.1”,
“barryvdh/laravel-ide-helper”: “~2”,
“barryvdh/laravel-debugbar”: “~2.0”
},
Adesso è venuto il momento di aggiornare le dipendenze quindi dai il comando:
composer update
per scaricare tutto il necessario.
Secondo Step – Creare un ServiceProvider
Come avrai notato tutti i package che installi ti chiedono di inserire il proprio ServiceProvider
all’interno del file di configurazione in modo che Laravel sappia della sua esistenza e che l’IoC Container
sia in grado di risolverlo automaticamente.
Invece di andare ad inserire ogni volta il ServiceProvider ne creeremo uno solo che si occuperà poi di includere i ServiceProvider dei vari packege.
Per prima cosa digita il comando:
php artisan make:provider LocalServiceProvider
A questo punto ti basterà includere nel file config/app.php
solo quest’ultimo provider:
‘AppProvidersLocalServiceProvider’
Adesso apri il ServiceProvider creato e modificalo così:
‘BarryvdhDebugbarFacade’,
];
/**
* Registro i Provider e le Facade
*
* @return void
*/
public function boot()
{
if ( $this->app->isLocal() )
{
$this->registerServiceProviders();
$this->registerFacadeAliases();
}
}
/**
* Load local service providers
*/
protected function registerServiceProviders()
{
foreach ($this->localProviders as $provider)
{
$this->app->register($provider);
}
}
/**
* Load additional Aliases
*/
public function registerFacadeAliases()
{
$loader = AliasLoader::getInstance();
foreach ($this->facadeAliases as $alias => $facade)
{
$loader->alias($alias, $facade);
}
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
// TODO: Implement register() method.
}
}
Il codice è molto semplice, ma vediamolo assieme.
Per prima cosa nell’array $localProviders
sono stati inseriri tutti i provoders dei package installati, stessa cosa è stata fatta per gli alias.
Nel metodo di boot
controlliamo se l’ambiente è impostato su local
e solo dopo aggiungiamo i provider e le facade.
Se domani volessi aggiungere un nuovo package utile solo nell’ambiente local non dovrai far altro che modificare questo file e verranno inclusi in automatico solo nella fase di sviluppo.