Wat zijn Laravel 5.0 gevels?

Software ontwerppatronen kunnen het beste worden gedefinieerd in de woorden van Martin Fowler:

Patronen bieden een mechanisme voor het geven van ontwerpadvies in een referentieformaat. Softwareontwerp is een enorm onderwerp en wanneer u wordt geconfronteerd met een ontwerpprobleem, moet u zich kunnen concentreren op iets dat zo dicht mogelijk bij het probleem ligt, zoals u kunt krijgen.

De code met ontwerppatronen is gemakkelijk te begrijpen, te onderhouden en uit te breiden. Het doel van deze tutorial is om de gevel in Laravel te promoten.

Wat is het gevelpatroon?

Volgens de definitie van de Bende van Vier, de facade ontwerppatroon is een structureel patroon dat een vereenvoudigde interface definieert naar een complexer subsysteem. Het patroon is gebaseerd op het creëren van een eenvoudige gevelinterface voor de verzameling van vereiste logica en methoden. De gevel zelf onderhoudt de afhankelijkheden.

De gevel lijkt erg op de adapter en decorateur patronen. De adapter fungeert als een brug tussen twee interfaces die niet compatibel zijn, terwijl de decorateur complexer is en wordt gebruikt voor het dynamisch veranderen van de manier waarop objecten zich gedragen.

Wat zijn Laravel-gevels?

Zoete syntaxis, die Laravel gebruikt, maakt het schrijven van code schoner en gemakkelijker te begrijpen. Laravelevoorgevels zijn eigenlijk de syntactische suiker voor de servicelocatie.

Laten we kijken naar Laravel Facade en de manier waarop het functioneert. De Cache gevel in Laravel ziet er zo uit:

php Cache :: get ('key'); Hoewel het lijkt alsof het een lading statische methoden gebruikt, biedt Laravel feitelijk een interface naar klassen die beschikbaar zijn in de service-container van de toepassing. Zoals u waarschijnlijk al weet, is de hierboven geschreven code gelijk aan:

php $ app = app (); $ App-> maken ( 'cache') -> te krijgen ( 'key');

De gevel van Laravel lokaliseert objecten verkoper / Laravel / framework / src / Illuminate / Ondersteuning / Gevels terwijl de Cache-gevel wordt geplaatst Cache.php:

php naamruimte Verlicht \ Ondersteuning \ Gevels; class Cache extends Facade / ** * Haal de geregistreerde naam van het onderdeel op. * * @return string * / beschermde statische functie getFacadeAccessor () return 'cache';

Wanneer we gebruiken cache :: te krijgen ( 'key') we zijn in feite de klas aan het bellen. Zorg ervoor dat u de alias van de bovengenoemde klasse in het configuratiebestand maakt config / app.php:

php 'aliases' => [// ... 'Cache' => Illuminate \ Support \ Facades \ Cache :: class,

De aliassen worden automatisch ingesteld door de Laravel-autolader. Als u de naam van de klasse instelt op cache, ontstaat consistentie met de gevel. Deze optie zorgt ervoor dat mensen die gevels gebruiken meer vertrouwd zijn met uw code.

De volgende drie methoden zijn cruciaal voor het genereren van een gevel:

  • __callStatic () PHP magische methode, die is gedefinieerd als de getFacadeAccessor methode in de kindklasse.
  • De gevelwortel, die de onderliggende klasse vertegenwoordigt waarop de facade methoden aanroept.
  • De resolveFacadeInstance methode is verantwoordelijk voor het oplossen van de juiste instantie van de service.

De implementatie van de methoden van de gevelklasse:

"php // ... openbare statische functie __callStatic ($ methode, $ args) $ instance = static :: getFacadeRoot (); switch (count ($ args)) case 0: return $ instance -> $ method ();

 case 1: return $ instance -> $ method ($ args [0]); case 2: return $ instance -> $ method ($ args [0], $ args [1]); case 3: return $ instance -> $ method ($ args [0], $ args [1], $ args [2]); case 4: return $ instance -> $ method ($ args [0], $ args [1], $ args [2], $ args [3]); standaard: return call_user_func_array (array ($ instantie, $ methode), $ args);  "

__callStatic roept in feite de IoC-container op om zich aan de klasse te binden. Het noemt ook de (niet-statische) methode door de switchcase via de PHP te gebruiken call_user_func_array () functie, waarbij de parametersarray aan het terugkerende object wordt doorgegeven getFacadeRoot () methode. De getFacadeRoot () methode wordt als volgt getoond:

php public static function getFacadeRoot () return static :: resolveFacadeInstance (static :: getFacadeAccessor ());

En de resolveFacadeInstance ():

"php beschermde statische functie resolveFacadeInstance ($ naam) if (is_object ($ naam)) geeft $ naam terug;

if (isset (static :: $ resolvedInstance [$ name])) return static :: $ resolvedInstance [$ name];  return static :: $ resolvedInstance [$ name] = static :: $ app [$ name]; "

Zoals gepresenteerd in de laatste regel van het artikel, in de resolveFacadeInstance methode, geeft Laravel het exemplaar van de service locator terug. Omdat de locator een zuiver exemplaar is van de oorspronkelijke klasse, concluderen we dat de façade Laravel niet overeenkomt met de definitie van het gevelpatroon van GoF. Dat zijn alleen servicelocaties. In tegenstelling tot de gevel van Laravel, maakt de Real Facade het schrijven van eenheidstesten moeilijk en soms zelfs onmogelijk, dankzij de creatie van hard-gecodeerde afhankelijkheden.

Voor diegenen die geloven dat DI via constructor een betere optie is dan het gebruik van de Laravel-gevel, wil ik u erop wijzen dat een extra configuratie kan worden toegevoegd.

Hoe de Laravel-gevel te creëren

Ik wil een checkbestand maken Laravel Facade dat verantwoordelijk is voor het controleren of het invoerbestand een pdf is of niet. Om dit te doen, moeten we eerst en vooral een Is Pdf Klasse binnen App / MyFacade / IsPdf.php:

"php namespace App \ MyFacade;

class IsPdf private $ pdf = "\ x25 \ x50 \ x44 \ x46 \ x2D";

openbare functiecontrole ($ bestand) return (file_get_contents ($ file, false, null, 0, strlen ($ this-> pdf)) === $ this-> pdf)? waar onwaar;  "

Ten tweede, bind de klas aan de serviceprovider. U maakt de nieuwe serviceprovider, die zich in bevindt App \ Providers \ IsPdfServiceProvider:

"php namespace App \ Providers;

gebruik Illuminate \ Support \ Facades \ App; gebruik Illuminate \ Support \ ServiceProvider;

class IsPdfServiceProvider breidt ServiceProvider uit / ** * Bootstrap de applicatieservices. * * @return void * / openbare functie boot () //

/ ** * Registreer de toepassingsservices. * * @return void * / public function register () App :: bind ('IsPdf', function () return new \ App \ MyFacade \ IsPdf;);  

"

Maak ten derde de Facade-klasse, als een uitbreiding van de eerder genoemde klasse Verlichten \ Support \ Gevels \ Facade . Je maakt de klasse die zich in zal bevinden App \ Gevels \ IsPdfFacade.php.

"php namespace App \ Facades; gebruik Illuminate \ Support \ Facades \ Facade;

class IsPdf breidt Facade uit beschermde statische functie getFacadeAccessor () return 'IsPdf'; "De laatste stap is om de gevel te registreren config / app.php:

"php / * * Application Service Providers ... * / App \ Providers \ IsPdfServiceProvider :: class,

"

En het alias:

php 'IsPdf' => App \ Facades \ IsPdf :: class

Gefeliciteerd! U hebt met succes een gevel van Laravel gemaakt. Voel je vrij om de gevel te testen door enkele codes te gebruiken, zoals:

php Route :: get ('/', function () IsPdf :: check ('/ files / file.pdf'););

Conclusie

Nu weten we dat de façade van Laravel het supereenvoudig maakt om methoden te gebruiken, en het injecteren van de werkelijke afhankelijkheden kan echt de moeite waard zijn. Natuurlijk heeft Laravel Facade zijn eigen voor- en nadelen. Het hangt af van de ontwikkelaar om de juiste optie te selecteren.

Raadpleeg het aanbod op de markt voor meer informatie over Laravel.

Wie weet, misschien moedigt dit artikel je aan om kader-agnostische code te ontwikkelen en het gebruik van gevels te vergeten! Succes!