Las interfaces son una gran parte del marco de Laravel. También puede llamarlos contratos, así es como se hace referencia a ellos en Github. Esta es la colección de interfaces que utiliza el propio framework Laravel. Al navegar por el repositorio de contratos en Github, puede familiarizarse con toda la API del marco. Todas las clases concretas del marco implementan estas diversas interfaces. De hecho, a la hora de conocer un proyecto de software, no es mala idea empezar navegando por todas las interfaces. Esto le indica qué métodos estarán disponibles para usted.


Repositorio de caché

Como ejemplo, podemos echar un vistazo al repositorio Cache.

Al observar esta interfaz, podemos ver que cualquier implementación concreta deberá cumplir con los métodos definidos en el contrato. Podemos ver esto sería cosas como has()get()pull()put()add()increment()decrement()forever()remember()sear()rememberForever(), y forget()Mientras miramos esto, podemos ver que es una excelente documentación. ¿Necesita saber qué métodos están disponibles para usted en una clase? Basta con mirar la interfaz que implementa. El componente de contratos de Laravel es una colección de interfaces para todas las diversas API que el Framework pone a disposición de los usuarios.


Enlaces de interfaz preconfigurados

Cualquier clase concreta puede implementar cualquier interfaz que desee siempre que se adhiera al contrato. Entonces, ¿cómo sabemos qué implementación obtendremos cuando solicitemos una interfaz específica? Si hace uso de Laravel, por supuesto, querrá hacer uso de la funcionalidad del marco, no solo de sus interfaces. Podemos encontrar el mapeo en registerCoreContainerAliases ()

Es en este método donde se declaran todos los alias predeterminados y sus asignaciones. Todo esto vuelve al concepto de poner clases en el contenedor y resolver objetos fuera del contenedor de servicios, también conocido como contenedor de IoC. Es debido al contenedor de servicios y al mapeo de alias que puede hacer cosas como las siguientes, que de hecho son exactamente lo mismo.

Ahora, este es un ejemplo del comportamiento que obtenemos para la clase de enrutamiento integrada de Laravel. Además de toda esta flexibilidad y azúcar sintáctico, el otro gran beneficio de todos estos contratos es que puede cambiar muy fácilmente la implementación predeterminada por otra cosa. Personalmente, hasta ahora no he tenido ninguna razón para tener que hacer esto. Si tiene una situación en la que un requisito particular de un proyecto exige que se utilice una clase particular o implementación de un componente, entonces no está fuera de suerte. Aún puede usar Laravel, solo necesita registrar su propio componente o clase en el contenedor de servicios. Luego, cuando solicite esa interfaz en su código, se le dará la implementación correcta. Aquí es donde puede obtener más información sobre el contenedor de servicios de LaravelExaminemos un poco más sobre cómo funciona esto.


Registrarse con el contenedor de servicios (poner clases en el contenedor)

A menudo escuchará la frase "registrarse en el contenedor de servicios" o "vincular al contenedor de servicios". Cuando escucho esto, simplemente pienso “Poner clases a disposición de la aplicación a través del contenedor de servicios”. Piense en el contenedor de servicios como una operación bidireccional. Registramos o colocamos clases en el contenedor de servicios, y luego podemos resolver, o sacar del contenedor de servicios, un objeto o instancia de cualquier clase registrada que nos gustaría utilizar. Esto suele suceder con el método register () de un proveedor de servicios. Por ejemplo, aquí está ese mismo registro para el componente Cache de Laravel.

Podemos ver que es el método singleton () el que hace el trabajo por nosotros. Esto es casi lo mismo que si llamara al método bind () . La diferencia entre los dos es que el patrón singleton le dará al desarrollador una instancia compartida del objeto en todo momento. No se crea un objeto nuevo cada vez. Ahora, en el fragmento de arriba, hay algunas opciones para varias claves. Esos son cachecache.storememcached.connectorCuál se resuelve depende de la configuración de la aplicación. Cuando se realiza una solicitud de una de esas claves, es el cierre el que devolverá una instancia de la clase dada.

Aquí está el método singleton () que es parte de la clase Container.

Este método en realidad hace uso del método bind () , pero establece el tercer parámetro en true, lo que indica que se trata de una instancia compartida. Aquí está el método bind () .

Lea los comentarios para comprender cómo funciona todo.


Resolver fuera del contenedor de servicios (sacar objetos del contenedor)

Resolver objetos fuera del contenedor de servicios simplemente significa que cuando va a usar un componente u objeto en el código de su aplicación, es el contenedor de servicios el que maneja la construcción de las dependencias y requisitos necesarios para simplemente entregar un objeto que está listo para hacerlo. trabajo. Es una conveniencia para el desarrollador y ocurre principalmente sin que usted se dé cuenta.

Considere la app()función auxiliar, que llama a un make()método en la clase de aplicación.

Aquí está ese make()método al que difiere.

Nuevamente, los comentarios nos ayudan a comprender lo que está sucediendo. En última instancia, el trabajo se realiza mediante el método make () del contenedor, que es el padre de la aplicación. Aquí está el método make ().

Podemos ver que después de toda la lógica de este método, finalmente se nos devuelve un Objeto. Este objeto es una instancia de lo que solicitó en el código de su aplicación. En otras palabras, dependiendo de la clave que solicitó, obtendrá el (Objeto | Servicio | Componente) deseado.

Una cosa a tener en cuenta en el make()método de la clase Application es que hace uso de un getAlias()método. Así es como puede pasar la clave, el alias, la clase o el contrato al app()método, y el marco sabe cómo resolver todo correctamente. Aquí está ese mismo método.

Podemos ver que hace uso de un operador ternario conveniente para verificar si ya hay un alias registrado y, de ser así, devolverlo. De lo contrario, devolvemos el valor de la variable abstracta $ que probablemente sea la clave. Así es como el contrato o la interfaz se normalizarían en una clave de alias estándar. En otras palabras, si pasa algo como Illuminate \ Contracts \ Routing \ Registrar, el software puede traducir esto a la clave del enrutador .


Resumen de contratos y alias de Laravel

En este tutorial, echamos un vistazo más de cerca al componente de alias y contratos de Laravel. Descubrimos que las interfaces en sí mismas actúan como una excelente documentación para ayudar a un desarrollador a explorar la API expuesta por cualquier clase dada del marco. También investigamos cómo, al crear instancias de objetos a través del contenedor de servicios, hay mucha flexibilidad en cómo hacerlo. Al observar de cerca cómo funciona todo esto, podemos ver cómo las clases Container y Application son realmente la carne y las papas de Laravel. Registramos clases en el contenedor de servicios y extraemos objetos de él según sea necesario. Esta es una base clave de cómo funciona Laravel.