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 Route
o DB
, 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 vendorlaravelframeworksrcIlluminateSupportFacades
directorio 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
Validator
y View
. Todos estos amplían la Facade
clase principal .
getFacadeAccesor ()
Todos estos archivos de clase amplían la Facade
clase 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 Route
Fachada 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 Route
fachada completa se ve así
__callStatic ($ método, $ args)
En la Facade
clase 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 DB
fachada y llamando a todo tipo de métodos como DB::table()
DB::insert()
DB::select()
DB::update()
y DB::delete()
. Todos estos son ejemplos del uso de este mismo patrón de fachada. Nuestra DB
Fachada contiene esta línea:
Al igual que en el Route
ejemplo 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
Facade
clase 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 ?
0 Comentarios