Los Service Providers son clases que permiten construir o crear instancias de otros objetos que a partir de la versión 5 de Laravel forman parte esencial de la arquitectura de este framework. Pues en ellos se definen cada uno de los objetos e instancias que serán cargados en el proyecto, es decir, es donde se registra todo el código requerido para que una aplicación funcione, tanto del framework mismo como cualquier otro desarrollado por nosotros y que necesitemos utilizar; permitiendo así crear una aplicación de manera más limpia, robusta y desacopladamente, pues sería como si estuviéramos construyéndola por bloques.
Estos Service Providers se encuentran registrados en el array $providers dentro del archivo config/app.php donde están listadas todas las clases de Service Providers que serán cargadas en la aplicación. Debemos tomar en cuenta que muchos de los Service Providers listados son diferidos (usando la propiedad $defer = true ), lo que significa que no serán cargados en cada petición por defecto, sino solo cuando los servicios que provee sean realmente necesarios. De esta manera se disminuye la sobrecarga de rendimiento y el tiempo de carga de la aplicación.
Podemos hacer uso de los Service Providers para extender las funcionalidades de Laravel o un paquete de terceros, es decir, a través de ellos se pueden registrar enlaces al contenedor de servicios, middleware, detectores de eventos, rutas etc a nuestra aplicación, y así nos permiten reusar código para adaptar el proyecto a nuestras necesidades.
Crear un service provider
Para generar un Service Provider ejecutamos por consola:
php artisan make:provider StydeServiceProvider
Esto creará un nuevo archivo en el directorio app\Providers llamado StydeServiceProvider.php, el cual contiene una clase con el mismo nombre que extiende a la clase Illuminate\Support\ServiceProvider como todos los Service Providers de Laravel, la cual es clase abstracta requiere que se defina al menos un método llamado register.
Método register
En este método solo se registrará aquellas clases o servicios que necesitan ser cargadas en el contenedor de servicios de Laravel, el cual es quien que gestiona las clases y sus dependencias en la aplicación, es decir, es donde registramos las implementaciones de clases que se ejecutarán al configurar el proyecto. Aquí no se deben registrar ninguna ruta, detector de eventos o cualquier otro código que pueda usar un servicio que es proveído via Service Provider porque puede que aún dicho servicio no esté cargado.
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class StydeServiceProvider extends ServiceProvider { /** * Register the application services. * * @return void */ public function register() { //Aquí se registran las vinculaciones al contenedor de servicios } }
Método boot
Este es el método que se usa para cargar todos los elementos que no podemos en el método register pues éste es llamado después que todos los servicios proveídos por los service providers han sido registrados y ya están disponibles para usarse. Por tanto podemos utilizar la inyección de dependencias para cargar los que queramos. Por ejemplo:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class StydeServiceProvider extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { view()->composer('view', function () { // }); } /** * Register the application services. * * @return void */ public function register() { // } }
Registro de Service Providers
Una vez terminado de definirse debemos registrarlo en el archivo de configuración config/app.php en el array $providers donde están los nombres de todos los service providers que usará la aplicación tanto los del núcleo de Laravel como los terceros y por supuesto los desarrollados por nosotros. Para registrarlo simplemente se agrega un nuevo elemento al array así:
'providers' => [ /* * Application Service Providers... */ App\Providers\AppServiceProvider::class, App\Providers\AuthServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, App\Providers\StydeServiceProvider::class, ],
Con esta información presente podemos trabajar con los Service Providers para crear nuevos componentes o extender los existentes como por ejemplo:
- Crear un componente que genere un HTML para mostrar enlaces con un botón como se mostró en el tutorial Crea un Facade personalizado en Laravel 5.1 donde se usó el método register para vincular la clase que genera el HTML al contenedor de servicios de Laravel.
- Agrupar información común de las vistas en una clase como se vio en Uso de los View Composer en Laravel 5 en el cual se usó el método boot para registrar las vistas con el facade View, así accediendo al servicio implementado en Illuminate\Contracts\View\Factory
- Crear una nueva regla de validación como se explicó en el tutorial Cambiar contraseña con Laravel (validando clave actual) en el que igualmente se usó el método boot para vincular la clase Validator creada para extender la de Laravel.
- También en el curso Crea tu primera aplicación con Laravel 5 se dedicó una lección a explicar cómo extender el componente LaravelCollective con la finalidad crear nuevos métodos para generar un menú para la aplicación.
Pero si lo que quieres es crear componentes para tus aplicaciones de Laravel o de PHP en general de manera profesional, entonces registrate en el curso Curso de creación de componentes para PHP y Laravel donde no sólo aprenderás acerca de la creación, funcionamiento y uso de los Service Providers en PHP así como también sobre Contenedores de inyección de dependencias, Facades, Interfaces, en otros temas.
Espero te haya gustado y lo puedas poner en práctica. No dejes de comentar y compartirlo en las redes sociales.
Material Relacionado
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Guía rápida de Laravel - Nivel intermedio Lección siguiente Cargando Service Providers condicionalmente en Laravel 5.1