Los patrones de diseño de software se definen mejor en las palabras de Martin Fowler:
Los patrones proporcionan un mecanismo para representar consejos de diseño en un formato de referencia. El diseño de software es un tema importante, y cuando se enfrenta a un problema de diseño, debe poder concentrarse en algo tan cercano al problema como pueda..
El código que emplea patrones de diseño es fácil de entender, mantener y extender. El objetivo de este tutorial es promocionar la fachada en Laravel..
Según la definición de Gang of Four, la fachada El patrón de diseño es un patrón estructural que define una interfaz simplificada para un subsistema más complejo. El patrón se basa en crear una interfaz de fachada simple frente a la colección de lógica y métodos necesarios. La fachada en sí mantiene las dependencias..
La fachada es muy similar a la adaptador y decorador patrones. El adaptador actúa como un puente entre dos interfaces que no son compatibles, mientras que el decorador es más complejo y se usa para cambiar dinámicamente la forma en que se comportan los objetos..
La sintaxis dulce, que utiliza Laravel, hace que la escritura de códigos sea más clara y fácil de entender. Las fachadas de Laravel son en realidad el azúcar sintáctico para la ubicación del servicio..
Echemos un vistazo a la fachada de Laravel y la forma en que funciona. los Cache
La fachada en Laravel se ve así:
php Cache :: get ('key');
Aunque parezca que está usando una carga de métodos estáticos, Laravel en realidad proporciona una interfaz para las clases que están disponibles en el contenedor de servicios de la aplicación. Como probablemente ya sepa, el código escrito anteriormente es equivalente a:
php $ app = app (); $ app-> make ('cache') -> get ('key');
La fachada de Laravel ubica los objetos en. proveedor / Laravel / framework / src / Illuminate / Support / Facades
mientras que la fachada de caché se coloca en Cache.php
:
espacio de nombres php Illuminate \ Support \ Facades; clase Caché extiende Fachada / ** * Obtenga el nombre registrado del componente. * * @return string * / función estática protegida getFacadeAccessor () return 'cache';
Cuando usamos cache :: get ('key')
De hecho, estamos llamando a la clase de arriba. Asegúrese de crear el alias de la clase mencionada anteriormente en el archivo de configuración config / app.php
:
php 'aliases' => [//… 'Cache' => Illuminate \ Support \ Facades \ Cache :: class,
Los alias son configurados automáticamente por el cargador automático Laravel. Establecer el nombre de la clase en caché crea coherencia con la fachada. Esta opción seguramente hará que las personas que usan fachadas se sientan más cómodas con su código.
Los siguientes tres métodos son cruciales para generar una fachada:
getFacadeAccessor
método en la clase infantil.resolverFacadeInstance
El método es responsable de resolver la instancia apropiada del servicio..La implementación de los métodos de clase de fachada:
"php //… función estática pública __callStatic ($ method, $ args) $ instance = static :: getFacadeRoot (); switch (count ($ args)) case 0: return $ instance -> $ method ();
caso 1: devolver $ instancia -> $ método ($ args [0]); caso 2: return $ instance -> $ method ($ args [0], $ args [1]); caso 3: devolver $ instancia -> $ método ($ args [0], $ args [1], $ args [2]); caso 4: devolver $ instancia -> método $ ($ args [0], $ args [1], $ args [2], $ args [3]); predeterminado: devolver call_user_func_array (array ($ instance, $ method), $ args); "
__callStatic
básicamente llama al contenedor IoC para enlazar con la clase. También llama a su método (no estático) utilizando el caso del conmutador a través de PHP call_user_func_array ()
Función, pasando la matriz de parámetros al objeto que regresa getFacadeRoot ()
método. los getFacadeRoot ()
El método se muestra de la siguiente manera:
php función pública estática getFacadeRoot () return static :: resolutionFacadeInstance (static :: getFacadeAccessor ());
Y el resolverFacadeInstance ()
:
"la función estática protegida por php resolverFacadeInstance ($ nombre) if (is_object ($ nombre)) devuelve $ nombre;
if (isset (static :: $ resolutionInstance [$ name])) return static; $ resolutionInstance [$ name]; devolver static :: $ resolverInstance [$ name] = static :: $ app [$ name]; "
Tal como se presenta en la última línea del artículo, en el resolverFacadeInstance
Método, Laravel devuelve la instancia del localizador de servicios. Debido a que el localizador es una instancia pura de la clase original, concluimos que la fachada de Laravel no coincide con la definición del patrón de fachada de GoF. Esas son solo ubicaciones de servicio. A diferencia de la fachada de Laravel, la fachada real hace que las pruebas de unidad de escritura sean difíciles y, a veces, incluso imposibles, debido a la creación de dependencias codificadas.
Para aquellos que creen que DI a través del constructor es una mejor opción que usar la fachada de Laravel, me gustaría informarle de que se puede incluir alguna configuración adicional.
Quiero crear un archivo de verificación Laravel Facade que sea responsable de verificar si el archivo de entrada es un pdf o no. Para hacer esto, primero debemos crear un Es pdf
Clase en App / MyFacade / IsPdf.php
:
"php namespace App \ MyFacade;
clase IsPdf private $ pdf = "\ x25 \ x50 \ x44 \ x46 \ x2D";
verificación de función pública ($ archivo) return (file_get_contents ($ archivo, falso, nulo, 0, strlen ($ este-> pdf)) === $ este-> pdf)? verdadero Falso; "
En segundo lugar, vincular la clase al proveedor de servicios. Creará el nuevo proveedor de servicios, que se ubicará en App \ Providers \ IsPdfServiceProvider:
"php namespace App \ Providers;
utilizar Illuminate \ Support \ Facades \ App; use Illuminate \ Support \ ServiceProvider;
la clase IsPdfServiceProvider extiende ServiceProvider / ** * Bootstrap los servicios de la aplicación. * * @return void * / public function boot () //
/ ** * Registrar los servicios de la aplicación. * * @return void * / public function register () App :: bind ('IsPdf', function () return new \ App \ MyFacade \ IsPdf;);
"
En tercer lugar, cree la clase Fachada, como una extensión de la clase mencionada anteriormente Iluminar \ Soporte \ Fachadas \ Fachada
. Va a crear la clase que se encuentra en App \ Fachadas \ IsPdfFacade.php
.
"php namespace App \ Fachadas; use Illuminate \ Support \ Facades \ Facade;
la clase IsPdf extiende la fachada función estática protegida getFacadeAccessor () return 'IsPdf'; "El último paso es registrar la fachada en config / app.php:
"php / * * Application Service Providers ... * / App \ Providers \ IsPdfServiceProvider :: class,
"
Y el alias:
php 'IsPdf' => App \ Facades \ IsPdf :: class
¡Felicidades! Has creado con éxito una fachada de Laravel. Siéntase libre de probar la fachada usando algunos códigos, tales como:
php Route :: get ('/', function () IsPdf :: check ('/ files / file.pdf'););
Ahora sabemos que la fachada de Laravel hace que sea súper fácil llamar a los métodos, y que inyectar las dependencias reales realmente podría ser rentable. Por supuesto, la Fachada Laravel tiene sus propias ventajas y desventajas. Depende del desarrollador seleccionar la opción correcta..
Para recursos adicionales con Laravel, asegúrese de revisar la oferta en el mercado.
Quién sabe, tal vez este artículo lo aliente a desarrollar un código independiente del marco y a olvidarse del uso de fachadas. Buena suerte!