Softwaredesignmuster lassen sich am besten mit den Worten von Martin Fowler definieren:
Muster bieten einen Mechanismus zum Rendern von Designhinweisen in einem Referenzformat. Softwaredesign ist ein gewaltiges Thema, und wenn Sie mit einem Designproblem konfrontiert sind, müssen Sie sich auf etwas konzentrieren können, das dem Problem so nahe kommt, wie Sie es können.
Der Code, der Entwurfsmuster verwendet, ist leicht zu verstehen, zu pflegen und zu erweitern. Der Zweck dieses Tutorials besteht darin, die Fassade in Laravel zu fördern.
Nach der Definition der Viererbande ist die Fassade Design Pattern ist ein Strukturmuster, das eine vereinfachte Schnittstelle zu einem komplexeren Subsystem definiert. Das Muster basiert auf der Erstellung einer einfachen Fassadenschnittstelle vor der Sammlung der erforderlichen Logik und Methoden. Die Fassade selbst hält die Abhängigkeiten aufrecht.
Die Fassade ist der sehr ähnlich Adapter und Dekorateur Muster. Der Adapter fungiert als Brücke zwischen zwei Schnittstellen, die nicht kompatibel sind, während der Dekorator komplexer ist und zum dynamischen Ändern des Verhaltens von Objekten verwendet wird.
Die von Laravel verwendete süße Syntax macht das Schreiben von Code sauberer und verständlicher. Laravel-Fassaden sind eigentlich der syntaktische Zucker für den Dienstleistungsstandort.
Werfen wir einen Blick auf Laravel Facade und seine Funktionsweise. Das Zwischenspeicher
Fassade in Laravel sieht so aus:
php Cache :: get ('key');
Obwohl es so aussieht, als würden statische Methoden geladen, bietet Laravel tatsächlich eine Schnittstelle zu Klassen, die im Service-Container der Anwendung verfügbar sind. Wie Sie wahrscheinlich bereits wissen, entspricht der oben beschriebene Code:
php $ app = app (); $ app-> make ('cache') -> get ('key');
Die Fassade von Laravel lokalisiert Objekte Verkäufer / Laravel / Framework / src / Illuminate / Support / Fassaden
während die Cache-Fassade platziert wird Cache.php
:
PHP-Namensraum Illuminate \ Support \ Fassaden; Klasse Cache erweitert Facade / ** * Ermittelt den registrierten Namen der Komponente. * * @return string * / protected statische Funktion getFacadeAccessor () return 'cache';
Wenn wir verwenden cache :: get ('key')
Wir nennen die Klasse tatsächlich oben. Stellen Sie sicher, dass Sie den Alias der oben genannten Klasse in der Konfigurationsdatei erstellen config / app.php
:
php 'aliases' => [//… 'Cache' => Illuminate \ Support \ Facades \ Cache :: class,
Die Aliasnamen werden vom Laravel-Autolader automatisch eingerichtet. Wenn Sie den Namen der Klasse für das Zwischenspeichern festlegen, wird eine Konsistenz mit der Fassade erzielt. Diese Option wird die Benutzer, die Fassaden verwenden, am sichersten mit Ihrem Code komfortabler machen.
Die folgenden drei Methoden sind entscheidend für die Generierung einer Fassade:
getFacadeAccessor
Methode in der Kindklasse.resolFacadeInstance
Die Methode ist für die Auflösung der richtigen Instanz des Dienstes verantwortlich.Die Implementierung der Fassadenklassenmethoden:
"php //… public static function __callStatic ($ method, $ args) $ instance = static :: getFacadeRoot (); switch (count ($ args)) case 0: return $ instance -> $ method ();
Fall 1: return $ instance -> $ method ($ args [0]); Fall 2: return $ instance -> $ method ($ args [0], $ args [1]); Fall 3: return $ instance -> $ method ($ args [0], $ args [1], $ args [2]); Fall 4: return $ instance -> $ method ($ args [0], $ args [1], $ args [2], $ args [3]); default: return call_user_func_array (array ($ instance, $ method), $ args); "
__callStatic
Ruft im Grunde den IoC-Container zur Bindung an die Klasse auf. Es ruft auch seine (nicht statische) Methode auf, indem der Switch-Fall über PHP verwendet wird call_user_func_array ()
Funktion, übergeben das Parameter-Array an das zurückkehrende Objekt getFacadeRoot ()
Methode. Das getFacadeRoot ()
Methode wird wie folgt gezeigt:
php public static function getFacadeRoot () return static :: resolFacadeInstance (static :: getFacadeAccessor ());
Und das resolFacadeInstance ()
:
"php-geschützte statische Funktion resolFacadeInstance ($ name) if (is_object ($ name)) gibt $ name zurück;
if (isset (statisch: $ resolvedInstance [$ name])) Rückgabe statisch: $ resolvedInstance [$ name]; Rückgabe statisch: $ resolvedInstance [$ name] = statisch :: $ app [$ name]; "
Wie in der letzten Zeile des Artikels dargestellt, in der resolFacadeInstance
Methode, gibt Laravel die Instanz des Service Locator zurück. Da der Locator eine reine Instanz der ursprünglichen Klasse ist, schließen wir, dass die Laravel-Fassade nicht mit der GoF-Fassadenmusterdefinition übereinstimmt. Dies sind nur Servicestandorte. Anders als bei der Laravel-Fassade macht die Real-Fassade die Prüfung von Schreibeinheiten aufgrund der Erstellung hartcodierter Abhängigkeiten schwierig und manchmal sogar unmöglich.
Für diejenigen, die der Meinung sind, dass DI via Konstruktor eine bessere Option ist als die Verwendung der Laravel-Fassade, möchte ich Sie darauf hinweisen, dass möglicherweise eine zusätzliche Konfiguration enthalten ist.
Ich möchte eine Prüfdatei Laravel Facade erstellen, die dafür zuständig ist, zu prüfen, ob die Eingabedatei ein PDF ist oder nicht. Um dies zu erreichen, müssen wir zuerst eine Ist Pdf
Klasse in App / MyFacade / IsPdf.php
:
"php namespace App \ MyFacade;
Klasse IsPdf private $ pdf = "\ x25 \ x50 \ x44 \ x46 \ x2D";
Öffentliche Funktionsprüfung ($ file) return (file_get_contents ($ file, false, null, 0, strlen ($ this-> pdf)) === $ this-> pdf)? wahr falsch; "
Zweitens binden Sie die Klasse an den Dienstanbieter. Sie erstellen den neuen Dienstanbieter, der sich in befindet App \ Providers \ IsPdfServiceProvider:
"php Namespace App \ Providers;
benutze Illuminate \ Support \ Facades \ App; Verwenden Sie Illuminate \ Support \ ServiceProvider.
Die Klasse IsPdfServiceProvider erweitert ServiceProvider / ** * Bootstrap der Anwendungsdienste. * * @return void * / public function boot () //
/ ** * Registrieren Sie die Anwendungsdienste. * * @return void * / public function register () App :: bind ('IsPdf', function () return new \ App \ MyFacade \ IsPdf;);
"
Drittens erstellen Sie die Facade-Klasse als Erweiterung der zuvor genannten Klasse Illuminate \ Support \ Fassaden \ Fassade
. Sie erstellen die Klasse, in der sich die Klasse befindet App \ Facades \ IsPdfFacade.php
.
"php namespace App \ Facades; benutze Illuminate \ Support \ Facades \ Facade;
Klasse IsPdf erweitert Facade geschützte statische Funktion getFacadeAccessor () return 'IsPdf'; "Der letzte Schritt ist die Registrierung der Fassade in config / app.php:
"php / * * Application Service Providers… * / App \ Providers \ IsPdfServiceProvider :: Klasse,
"
Und der Alias:
php 'IsPdf' => App \ Facades \ IsPdf :: class
Herzliche Glückwünsche! Sie haben erfolgreich eine Laravel-Fassade erstellt. Fühlen Sie sich frei, um die Fassade mit einigen Codes zu testen, wie zum Beispiel:
php Route :: get ('/', function () IsPdf :: check ('/ files / file.pdf'););
Jetzt wissen wir, dass die Laravel-Fassade das Aufrufen von Methoden sehr einfach macht, und das Einfügen der tatsächlichen Abhängigkeiten könnte sich auf der ganzen Linie auszahlen. Natürlich hat Laravel Facade eigene Vor- und Nachteile. Es hängt vom Entwickler ab, die richtige Option auszuwählen.
Weitere Ressourcen mit Laravel finden Sie auf dem Marktplatz.
Wer weiß, vielleicht werden Sie in diesem Artikel ermutigt, rahmenunabhängigen Code zu entwickeln und die Verwendung von Fassaden zu vergessen! Viel Glück!