banner-service-providers-condicionalmente

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

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