En un tutorial anterior vimos Cómo Funcionan los Service providers en Laravel 5.1 donde conocimos cómo agregar service providers para cargar implementaciones de clases y objetos a nuestro proyecto, pero ¿Qué sucede si lo que queremos cargar es una clase o paquete de tercero que dependa de una condición?
Un ejemplo de este tipo de necesidad lo vimos en Qué son los Service Providers de Laravel y cómo usarlos donde se quería usar service providers para configurar una implementación de una interfaz diferente siempre que estuvieramos en el entorno de pruebas.
Como resultado se crearon dos services providers ArrayRepoProvider.php que se cargaría cuando se estuviera en el entorno de testing y EloquentRepoProvider.php para los demás casos.
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class ArrayRepoProvider extends ServiceProvider { public function register() { $this->app->bind( 'Cms\Section\SectionRepoInterface', 'Cms\Stubs\Section\ArraySectionRepo' ); } }
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class EloquentRepoProvider extends ServiceProvider { public function register() { $this->app->bind( 'Cms\Section\SectionRepoInterface', 'Cms\Section\SectionRepo' ); } }
Sin embargo, en esa oportunidad se desarrolló la solución trabajando con base en Laravel 4, pero ahora en Laravel 5 ya no existen los archivos de configuración por carpetas según el entorno, sino que tenemos un solo archivo .env en el que se indica en la variable APP_ENV el entorno en el cual se está cargando el proyecto y además lo usual es registrar todos los services providers en el array $providers del archivo config/app.php , los cuales, se cargarán independientemente del entorno en el que se esté. Por tanto no sería el lugar apropiado para registrar los dos service providers del ejemplo.
La solución aplicable a un proyecto con Laravel 5.1 es utilizar el service provider creado por defecto para cargar y registrar las implementaciones de clases que se usarán en el proyecto: app/Providers/AppServiceProvider.php haciendo uso del método $this->app->register() que se encuentra disponible en el contenedor de servicios de Laravel, el cual tiene como función registrar un service provider, y para este caso solo se ejecutará dependiendo del entorno, de esta manera:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot() { // } public function register() { if ($this->app->environment('testing')) { $this->app->register('App\Providers\ArrayRepoProvider'); } else { $this->app->register('App\Providers\EloquentRepoProvider'); } } }
De igual forma, podemos usar $this->app->boot() en el método boot() para cargar aquellos service providers condicionales que necesiten de otros servicios.
Pero, esto no solo lo podemos usar para implementar interfaces o clases también podemos cargar paquetes que solo se usen en un entorno como por ejemplo la barra de depuración de Laravel en el entorno local para evitar cargar en producción servicios innecesarios, así:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function register() { if ($this->app->environment('local')) { $this->app->register('Barryvdh\Debugbar\ServiceProvider'); $this->app->alias('Debugbar','Barryvdh\Debugbar\Facade'); } } }
Si te gustó el tutorial recuerda dejar tus comentarios y compartirlo en tus redes sociales. Pero, además si quieres solicitar un tutorial de un tema en específico puedes hacerlo en TeachMe.
Material relacionado
- Cómo Funcionan los Service providers en Laravel 5.1
- Qué son los Service Providers de Laravel y cómo usarlos
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Cómo funcionan los Service Providers en Laravel 5.1 Lección siguiente "Date Mutators" con Eloquent en Laravel 5.1