Cómo registrarse y utilizar los proveedores de servicios de Laravel

Si alguna vez te has topado con el marco de Laravel, es muy poco probable que no hayas oído hablar de contenedores de servicios y proveedores de servicios. De hecho, son la columna vertebral del marco de Laravel y hacen todo el trabajo pesado cuando inicias una instancia de cualquier aplicación de Laravel..

En este artículo, veremos de qué se trata el contenedor de servicios y, a continuación, analizaremos en detalle al proveedor de servicios. En el curso de este artículo, también demostraré cómo crear un proveedor de servicios personalizado en Laravel. Una vez que cree un proveedor de servicios, también debe registrarlo con la aplicación Laravel para poder usarlo realmente, por lo que también lo haremos.

Existen dos métodos importantes, arranque y registro, que su proveedor de servicios puede implementar, y en el último segmento de este artículo analizaremos estos dos métodos a fondo..

Antes de profundizar en la discusión de un proveedor de servicios, intentaré presentar el contenedor de servicios, ya que se utilizará en gran medida en la implementación de su proveedor de servicios.

Comprender los contenedores de servicios y proveedores de servicios

¿Qué es un contenedor de servicios??

En términos simples, podríamos decir que el contenedor de servicios en Laravel es un cuadro que contiene varios enlaces de componentes, y se sirven según sea necesario en toda la aplicación.

En palabras de la documentación oficial de Laravel:

El contenedor de servicios Laravel es una herramienta poderosa para administrar las dependencias de clase y realizar la inyección de dependencias.

Por lo tanto, siempre que necesite inyectar cualquier componente o servicio incorporado, puede escribirlo en su constructor o método, ¡y se inyectará automáticamente desde el contenedor del servicio ya que contiene todo lo que necesita! ¿No es genial? Le evita tener una instanciación manual de los componentes y, por lo tanto, evita el acoplamiento estrecho en su código.

Echemos un vistazo a un ejemplo rápido para entenderlo..

Class SomeClass public function __construct (FooBar $ foobarObject) // use $ foobarObject object

Como puedes ver, la Algo de clase necesita una instancia de FooBar para instanciarse. Entonces, básicamente, tiene una dependencia que necesita ser inyectada. Laravel hace esto automáticamente mirando en el contenedor del servicio e inyectando la dependencia apropiada.

Y si se pregunta cómo Laravel sabe qué componentes o servicios incluir en el contenedor de servicios, la respuesta es el proveedor de servicios. Es el proveedor de servicios que le dice a Laravel que vincule varios componentes en el contenedor de servicios. De hecho, se llama enlaces de contenedor de servicios, y debe hacerlo a través del proveedor de servicios..

Entonces, es el proveedor de servicios el que registra todos los enlaces del contenedor de servicios, y se realiza a través del método de registro de la implementación del proveedor de servicios..

Eso debería traer otra pregunta sobre la mesa: ¿cómo sabe Laravel acerca de varios proveedores de servicios? ¿Acabas de decir algo? Acabo de escuchar a alguien decir eso, ¡Laravel debería darse cuenta de eso automáticamente! Oh, chico, eso es mucho pedir: Laravel es un marco, no un superhombre, ¿no es así? Bromeando aparte, eso es algo que necesitas informar explícitamente a Laravel.

Anímate y mira los contenidos de la config / app.php expediente. Encontrará una entrada de matriz que enumera todos los proveedores de servicios que se cargarán durante el arranque de la aplicación Laravel.

'proveedores' => [/ * * Laravel Framework Service Providers… * / Illuminate \ Auth \ AuthServiceProvider :: class, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ BusServiceProvider :: class, Illuminate \ Cache \ CacheServiceProvider :: class, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: class, Illuminate \ Cookie \ CookieServiceProvider :: class, Illuminate \ Database \ DatabaseServiceProvider :: class, Illuminate \ Encryption \ EncryptionServiceProvider :: class, Illuminate \ Filesystem \ Filesystem \ \ Foundation \ Providers \ FoundationServiceProvider :: class, Illuminate \ Hashing \ HashServiceProvider :: class, Illuminate \ Mail \ MailServiceProvider :: class, Illuminate \ Notifications \ NotificationServiceProvider :: class, Illuminate \ Pagination \ PaginationServiceProvider :: class, Illuminate \ Paginacion PipelineServiceProvider :: class, Illuminate \ Queue \ QueueServiceProvider :: class, Illuminate \ Redis \ RedisServiceProvider :: class, Illuminate \ Auth \ Passwords \ PasswordResetServiceP rovider :: class, Illuminate \ Session \ SessionServiceProvider :: class, Illuminate \ Translation \ TranslationServiceProvider :: class, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ View \ ViewServiceProvider :: class, / * * Proveedores de servicios de paquetes ... * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Application Service Providers ... * / App \ Providers \ AppServiceProvider :: class, App \ Providers \ AuthServiceProvider :: class, // App \ Providers \ BroadcastServiceProvider :: class, App \ Providers \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class,],

Entonces, ese era el contenedor de servicio a su disposición. A partir de la siguiente sección, nos centraremos en el proveedor de servicios, que es el tema principal de este artículo.!

¿Qué es un proveedor de servicios??

Si el contenedor de servicios es algo que le permite definir vinculaciones e inyectar dependencias, entonces el proveedor de servicios es el lugar donde ocurre.

Echemos un vistazo rápido a uno de los proveedores de servicios centrales para entender lo que hace. Sigue adelante y abre el vender / laravel / framework / src / Illuminate / Cache / CacheServiceProvider.php expediente.

registro de función pública () $ this-> app-> singleton ('cache', function ($ app) devolver el nuevo CacheManager ($ app);); $ this-> app-> singleton ('cache.store', function ($ app) return $ app ['cache'] -> driver ();); $ this-> app-> singleton ('memcached.connector', function () return new MemcachedConnector;); 

Lo importante a tener en cuenta aquí es la registro Método, que le permite definir enlaces de contenedores de servicios. Como puede ver, hay tres enlaces para el cache, cache.store y memcached.connector servicios.

Básicamente, le informamos a Laravel que siempre que haya una necesidad de resolver un problema. cache entrada, debe devolver la instancia de CacheManager. Así que solo estamos agregando un tipo de asignación en el contenedor de servicios al que se puede acceder a través de $ this-> app.

Esta es la forma correcta de agregar cualquier servicio a un contenedor de servicio de Laravel. ¡Eso también le permite darse cuenta de cómo Laravel pasa por el método de registro de todos los proveedores de servicios y llena el contenedor de servicios! Y como hemos mencionado anteriormente, recoge la lista de proveedores de servicios del config / app.php expediente.

Y esa es la historia del proveedor de servicios. En la siguiente sección, analizaremos cómo crear un proveedor de servicios personalizado para que pueda registrar sus servicios personalizados en el contenedor de servicios de Laravel.

Cree su proveedor de servicios personalizados

Laravel ya viene con una herramienta práctica de línea de comandos., artesano, que le permite crear un código de plantilla para que no tenga que crearlo desde cero. Continúe y vaya a la línea de comandos y ejecute el siguiente comando en la raíz de su aplicación para crear un proveedor de servicios personalizado.

$ php artisan make: proveedor EnvatoCustomServiceProvider Provider creado correctamente.

Y eso debería crear el archivo. EnvatoCustomServiceProvider.php bajo la aplicación / Proveedores directorio. Abra el archivo para ver lo que contiene.

Como comentamos anteriormente, existen dos métodos, el de inicio y el de registro, con los que trabajará la mayor parte del tiempo cuando trabaje con su proveedor de servicios personalizado..

los registro método es el lugar donde se definen todos los enlaces de contenedor de servicios personalizados. Por otro lado, la bota método es el lugar donde puede consumir servicios ya registrados a través del método de registro. En el último segmento de este artículo, analizaremos estos dos métodos en detalle a medida que veremos algunos casos prácticos de uso para comprender el uso de ambos métodos..

Registre su proveedor de servicios personalizados

Así que ha creado su proveedor de servicios personalizados. ¡Eso es genial! A continuación, debe informar a Laravel acerca de su proveedor de servicios personalizado para que pueda cargarlo junto con otros proveedores de servicios durante el arranque.

Para registrar su proveedor de servicios, solo necesita agregar una entrada a la gama de proveedores de servicios en el config / app.php expediente.

'proveedores' => [/ * * Laravel Framework Service Providers… * / Illuminate \ Auth \ AuthServiceProvider :: class, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ BusServiceProvider :: class, Illuminate \ Cache \ CacheServiceProvider :: class, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: class, Illuminate \ Cookie \ CookieServiceProvider :: class, Illuminate \ Database \ DatabaseServiceProvider :: class, Illuminate \ Encryption \ EncryptionServiceProvider :: class, Illuminate \ Filesystem \ Filesystem \ \ Foundation \ Providers \ FoundationServiceProvider :: class, Illuminate \ Hashing \ HashServiceProvider :: class, Illuminate \ Mail \ MailServiceProvider :: class, Illuminate \ Notifications \ NotificationServiceProvider :: class, Illuminate \ Pagination \ PaginationServiceProvider :: class, Illuminate \ Paginacion PipelineServiceProvider :: class, Illuminate \ Queue \ QueueServiceProvider :: class, Illuminate \ Redis \ RedisServiceProvider :: class, Illuminate \ Auth \ Passwords \ PasswordResetServiceP rovider :: class, Illuminate \ Session \ SessionServiceProvider :: class, Illuminate \ Translation \ TranslationServiceProvider :: class, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ View \ ViewServiceProvider :: class, / * * Proveedores de servicios de paquetes ... * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Application Service Providers ... * / App \ Providers \ AppServiceProvider :: class, App \ Providers \ AuthServiceProvider :: class, // App \ Providers \ BroadcastServiceProvider :: class, App \ Providers \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class, App \ Providers \ EnvatoCustomServiceProvider :: class,],

¡Y eso es! ¡Has registrado a tu proveedor de servicios con el esquema de cosas de Laravel! Pero el proveedor de servicios que hemos creado es casi una plantilla en blanco y no tiene uso en este momento. En la siguiente sección, veremos un par de ejemplos prácticos para ver qué podría hacer con los métodos de registro e inicio..

Ir a través de los métodos de registro y arranque

Para empezar, vamos a pasar por el registro Método para entender cómo se puede usar. Abra el archivo del proveedor de servicios aplicación / Proveedores / EnvatoCustomServiceProvider.php que se creó anteriormente y reemplazar el código existente con el siguiente.

app-> bind ('App \ Library \ Services \ DemoOne', function ($ app) return new DemoOne ();); 

Hay dos cosas importantes a tener en cuenta aquí:

  • Hemos importado App \ Library \ Services \ DemoOne para que podamos utilizarlo. los DemoOne La clase aún no está creada, pero lo haremos en un momento..
  • En el método de registro, hemos utilizado el enlazar Método del contenedor de servicios para agregar nuestro enlace de contenedor de servicios. Entonces, cuando App \ Library \ Services \ DemoOne la dependencia necesita ser resuelta, llamará a la función de cierre, y creará una instancia y devolverá el App \ Library \ Services \ DemoOne objeto.

Así que solo necesitas crear el app / Library / Services / DemoOne.php archivo para que esto funcione.

Y aquí está el código en algún lugar de su controlador donde se inyectará la dependencia.

doSomethingUseful (); 

Ese es un ejemplo muy simple de unir una clase. De hecho, en el ejemplo anterior, no es necesario crear un proveedor de servicios e implementar el método de registro como lo hicimos nosotros, ya que Laravel puede resolverlo automáticamente mediante la reflexión..

Una nota muy importante de la documentación de Laravel:

No hay necesidad de unir clases en el contenedor si no dependen de ninguna interfaz. El contenedor no necesita recibir instrucciones sobre cómo construir estos objetos, ya que puede resolverlos automáticamente mediante la reflexión..

Por otro lado, hubiera sido realmente útil si hubiera enlazado una interfaz a una implementación determinada. Veamos un ejemplo para entenderlo..

Vamos a crear una interfaz muy simple en app / Library / Services / Contracts / CustomServiceInterface.php.

A continuación, vamos a crear dos implementaciones concretas de esta interfaz. Básicamente, solo necesitamos crear dos clases que extiendan la CustomServiceInterface interfaz.

Crear el DemoOne clase en app / Library / Services / DemoOne.php.

similar, DemoTwo entra app / Library / Services / DemoTwo.php.

Ahora, en lugar de enlazar una clase, enlazaremos una interfaz. Volver a visitar EnvatoCustomServiceProvider.php y cambia el código como se muestra abajo.

app-> bind ('App \ Library \ Services \ Contracts \ CustomServiceInterface', function ($ app) return new DemoOne ();); 

En este caso, hemos vinculado el Aplicación \ Biblioteca \ Servicios \ Contratos \ CustomServiceInterface interfaz a la DemoOne implementación. Por lo tanto, siempre que Aplicación \ Biblioteca \ Servicios \ Contratos \ CustomServiceInterface la dependencia necesita ser resuelta, crea una instancia y devuelve el App \ Library \ Services \ DemoOne objeto. Ahora tiene más sentido, ¿no es así??

Revisemos rápidamente el código del controlador también.

doSomethingUseful (); 

Como habrás adivinado, la $ customServiceInstance debe ser la instancia de App \ Library \ Services \ DemoOne! La belleza de este enfoque es que puede intercambiar DemoOne Implementación con el otro fácilmente..

Digamos que quieres usar el DemoTwo implementación en lugar de DemoOne. En ese caso, solo necesita hacer los siguientes cambios en el proveedor de servicios EnvatoCustomServiceProvider.php.

Encuentra la siguiente línea:

utilizar App \ Library \ Services \ DemoOne;

Y reemplazarlo con:

utilizar App \ Library \ Services \ DemoTwo;

Del mismo modo, encontrar este:

volver nuevo DemoOne ();

Eso debería ser reemplazado por:

volver nuevo DemoTwo ();

Se puede utilizar el mismo enfoque si desea reemplazar cualquier implementación central por la suya. Y no es solo el método de enlace que podría usar para sus enlaces de contenedor de servicio; El contenedor de servicio de Laravel proporciona varias formas de enlace en el contenedor de servicio. Por favor, consulte la documentación oficial de Laravel para la referencia completa.

El siguiente candidato es el bota Método, que podría utilizar para ampliar la funcionalidad Laravel del núcleo. En este método, puede acceder a todos los servicios que se registraron utilizando el método de registro del proveedor de servicios. En la mayoría de los casos, desea registrar sus escuchas de eventos en este método, que se activará cuando ocurra algo.

Veamos un par de ejemplos que requieren la implementación del método de arranque..

Desea agregar su propio validador de campo de formulario personalizado a Laravel.

función pública boot () Validator :: extend ('my_custom_validator', función ($ atributo, $ valor, $ parámetros, $ validador) // la lógica de validación va aquí ...); 

Si desea registrar un editor de vistas, ¡es el lugar perfecto para hacerlo! De hecho, podríamos decir que el método de arranque se usa con frecuencia para agregar compositores de vistas!

función pública boot () View :: composer ('demo', 'App \ Http \ ViewComposers \ DemoComposer'); 

Por supuesto, usted quiere importar una fachada. Iluminar \ Soporte \ Fachadas \ Ver en su proveedor de servicios en primer lugar.

En el mismo territorio, podría compartir los datos a través de múltiples vistas también!

función pública boot () View :: share ('key', 'value'); 

También se puede utilizar para definir enlaces explícitos de modelos..

función pública boot () parent :: boot (); Route :: model ('usuario', App \ User :: class); 

Estos fueron algunos ejemplos para demostrar el uso del método de arranque. Cuanto más entre a Laravel, más razones encontrará para implementarlo.!

Y con eso, hemos llegado al final de este artículo. Espero que hayan disfrutado los temas que se discutieron a lo largo de este artículo..

Conclusión

La discusión de los proveedores de servicios fue el centro de atracción de este artículo, aunque comenzamos nuestro artículo con el contenedor de servicios, ya que era un ingrediente importante para entender al proveedor de servicios..

Después de eso, desarrollamos un proveedor de servicios personalizados y en la última parte del artículo analizamos un par de ejemplos prácticos..

Para aquellos de ustedes que ya están comenzando con Laravel o que desean ampliar sus conocimientos, sitio o aplicación con extensiones, tenemos una variedad de cosas que puede estudiar en Envato Market..

Si tiene alguna consulta o comentario, simplemente tómelo utilizando el feed a continuación.!