Local Environment – Come Gestire al Meglio le Dipendenze

0
588

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.