Joven Laraveler , ¿crees en el destino? Por qué no? ¿Porque no tienes el control? Estás aquí porque sabes algo. No es fácil para ti explicar, como lo sientas. Lo ha sentido desde que comenzó a programar en PHP. Hay algo mal con PHP y sus frameworks. No está seguro de qué es, pero está ahí. Como una fuga de memoria que no puedes encontrar, volviéndote loco. Este sentimiento te ha traído a Laravel. ¿Sabes de lo que estóy hablando?

¿La fachada?

¿Quieres saber qué es?

Las fachadas están en todas partes, están alrededor de nuestro código. Incluso ahora, en este fragmento muy simple

Hay una fachada que te ciega de la verdad.

¿Que verdad?

Que ha adquirido hábitos horribles en su viaje de código espagueti PHP en su búsqueda para crear sitios web y aplicaciones. Que ahora eres esclavo de esta prisión que ha sido creada. En última instancia, a nadie se le puede decir qué es la Fachada. Tienes que verlo por ti mismo. Esta es tu última oportunidad, después de esto, no hay vuelta atrás:


Tenías que ir y tomar la píldora roja, ¿no?

Has elegido ver la verdad y te lo proporcionaremos, nada más ...

Con un guiño a Matrix, investigaremos las fachadas. 🙂 En la matriz, el sistema era el enemigo, sin embargo, en Laravel, las fachadas son en realidad tus amigos. Notarás que gran parte de la codificación realizada en Laravel parece que está llamando a métodos estáticos para darle una sintaxis agradable y corta. La verdad es que eso no es lo que está sucediendo, Laravel está haciendo uso de su clase Facade para brindarle esta excelente sintaxis, mientras que al mismo tiempo, emplea el Contenedor de IoC para crear instancias de objetos y cualquier dependencia para que usted use. Como puede ver, la sintaxis corta actúa casi como una macro o un atajo. Si bien parecen clases estáticas, en realidad no lo son. Lo que esto hace es desacoplar su código de la implementación.


Formato de una fachada

La mayoría de las veces en Laravel, verá algo similar o siguiendo el formato de Component :: verb () . El componente sería algo como RouteDB, y el verbo sería algo que describa la acción realizada en ese componente, como get () o select () .


Cómo funciona la fachada

Si navega hasta el vendorlaravelframeworksrcIlluminateSupportFacadesdirectorio en su instalación de Laravel, verá una colección de archivos de clase Facade como App Artisan Auth Blade Cache Config Cookie Crypt DB Event Facade File Form Hash HTML Input Lang Log Mail Paginator Password Queue Redirect Response Route Schema Session SSH URL ValidatorViewTodos estos amplían la Facadeclase principal .

getFacadeAccesor ()

Todos estos archivos de clase amplían la Facadeclase y actúan como clases de apoyo para obtener acceso a un objeto en el contenedor de IoC. Todos estos archivos de clases que se extienden Facade tienen un método llamado getFacadeAccesor()El trabajo de este método es informar qué objeto se resuelve desde el contenedor de IoC. Entonces en nuestra RouteFachada esta línea:

devuelve el enrutador de cadena , por lo que eso es lo que se resuelve y se pone a nuestra disposición.

La Routefachada completa se ve así

__callStatic ($ método, $ args)

En la Facadeclase principal , se llama a este método cuando se llama a un método estático que no existe en una clase. Entonces, cuando llama Route::get(), la clase Facade lo transforma en algo como, $app['router']->get('/', function()por ejemplo: resuelva el enrutador fuera del contenedor de IoC y luego llame al método get . Esto proporciona una gran flexibilidad en su código.

En nuestro tutorial de Laravel CRUD, estábamos haciendo uso de la DBfachada y llamando a todo tipo de métodos como DB::table() DB::insert() DB::select() DB::update()DB::delete()Todos estos son ejemplos del uso de este mismo patrón de fachada. Nuestra DBFachada contiene esta línea:

Al igual que en el Routeejemplo anterior, el método devuelve la cadena que identifica qué objeto se resolverá. Así que de nuevo cuando llamamos:

Laravel funcionará de forma mágica y en realidad ejecutará algo más como:


Ruede su propia fachada

Personalmente, me gusta apegarme a lo que han creado los maestros antes que yo, pero digamos que eres más del tipo aventurero. Si desea una implementación diferente de la clase DB en su aplicación, puede hacerlo. Tal vez usted y su equipo creen una clase de base de datos capaz de matar al Agente Smith con poderes de Kung Fu. Esta clase se llama KungFuData. Si desea utilizar KungFuData en su aplicación en lugar de la versión incorporada, simplemente puede hacer esto:

Ahora se puede acceder directamente a KungFuData desde el contenedor, y DB Facade ahora también usará KungFuData. Puede reemplazar implementaciones en Laravel, y esta nueva clase se usará en toda su aplicación.


En resumen

  • Cada clase de Facade usa getFacadeAccessor()que devuelve una cadena para identificar el objeto a resolver
  • La clase de fachada principal utiliza __callStatic()para activar la resolución.
  • El uso del patrón Facade de Laravel nos proporciona una sintaxis estática bonita, elegante. Esto ayuda a reducir parte de la sobrecarga con la que normalmente tendría que lidiar cada vez que desee utilizar un objeto. Por ejemplo, crear nuevos objetos con la nueva palabra clave, asignar la configuración inicial al objeto, colocar esa implementación en una variable y finalmente acceder a métodos y propiedades haciendo algo como $myobject->mymethod()o$myobject->myproperty
  • Mantiene la capacidad de probar el código. La integración con Mockery está incorporada en la clase Facade para permitir una burla de objetos rápida y fácil.
  • Cambie fácilmente las versiones de API
  • Gracias a la Facadeclase podemos usar DB :: insert () o Route :: get () y Laravel hará todo el trabajo pesado por nosotros instanciando nuestros objetos y llamando a los métodos correctos de forma automática. No tenemos que usar $ app ['db'] -> insert () o $ app ['router'] -> get () , Laravel hará esto por ti.

Vaya , esta es la madriguera de conejo que tenemos aquí en el país de las maravillas, ¿sí, Neo ?