Laravel 4: Fassade vs DI (Wann)
Mein Verständnis ist, dass eine Fassade ist als alternative zu dependency injection. Bitte korrigieren wenn ich mich Irre. Was ist nicht klar ist, Wann sollte man die eine oder die andere.
Was sind die Vorteile/Nachteile des jeweiligen Ansatzes? Wie sollte ich bestimmen, Wann eine oder die andere?
Schließlich, warum nicht beide verwenden? Ich kann eine Fassade mit Verweis auf eine Schnittstelle. Es scheint Sentry 2 ist so geschrieben. Gibt es eine best practice?
Du musst angemeldet sein, um einen Kommentar abzugeben.
FASSADEN
Fassaden sind keine alternative für dependency injection.
Laravel Fassade ist eine Implementierung des Service-Locator-Muster, die Schaffung einer sauberen und schönen Weise der Zugriff auf Objekte:
Dies ist die PHP-syntax für einen statischen Methoden, aber Laravel ändert sich das Spiel und machen Sie nicht statisch hinter die kulissen und gibt Ihnen einen schönen, angenehmen und überprüfbare Art und Weise des Schreibens Ihre Anwendungen.
DEPENDENCY INJECTION
Dependency Injection ist, im Grunde, eine Möglichkeit der übergabe von Parametern an Ihre Konstruktoren und Methoden, während automatisch instatiating Sie.
Eine bessere Konstruktion wäre es mit Schnittstellen auf Ihre Abhängigkeit von den Injizierten Konstruktoren:
Aber beachten Sie, dass in Laravel können Sie injizieren Klassen und Schnittstellen auf die gleiche Weise. Injizieren Schnittstellen, die Sie gerade haben, Sie zu erzählen, die man wird so sein:
Dieser wird Ihnen sagen, Laravel, dass jedes mal, wenn einer Ihrer Methoden muss eine Instanz von MyInterface sollte es geben, es zu einem von MyOtherClass.
Was hier passiert, ist, dass diese constuctor hat eine "Abhängigkeit":
MyOtherClass
werden, automatisch injiziert, die von Laravel mit der IoC-container. Also, wenn Sie erstellen eine Instanz vonMyClass
, Laravel automatisch, erstellt eine Instanz derMyOtherClass
und steckte es in die variable$class
.Dependency Injection ist nur eine ungerade jargon Entwickler geschaffen, um zu tun, etwas so einfaches wie "automatische Generierung von Parametern".
, WANN EINE ODER DIE ANDERE?
Wie Sie sehen können, Sie sind völlig verschiedene Dinge, so dass Sie nie brauchen, um zwischen Ihnen zu entscheiden, aber Sie haben, um zu entscheiden, wohin Sie gehen, um mit dem einen oder anderen in den verschiedenen teilen der Anwendung.
Verwenden Fassaden zu erleichtern, die, wie Sie schreiben Sie Ihren code. Zum Beispiel: es ist eine gute Praxis, um Pakete zu erstellen, die für Ihre Anwendung Module, also zum erstellen von Fassaden für die Pakete ist auch ein Weg, um Sie zu machen scheinen, wie eine Laravel public class und den Zugriff auf Sie mit der statischen syntax.
Dependency Injection jede Zeit muss Ihre Klasse die Daten oder die Bearbeitung einer anderen Klasse. Es wird Ihr code getestet werden, da Sie in der Lage zu "injizieren" eine Modell der Abhängigkeiten in Ihre Klasse und Sie wird auch die Ausübung der einzelne Verantwortung Prinzip (nehmen Sie einen Blick auf die SOLID Prinzipien).
MyOtherClass
in deinem Beispiel irgendwie besiegen den Punkt der DI?$this->property = $property
fehlt ein Semikolon?Fassaden, wie bereits erwähnt, soll erleichtern, eine potentiell komplizierte Schnittstelle.
Fassaden sind noch testbar
Laravel Implementierung geht einen Schritt weiter und ermöglicht es Ihnen zu definieren, die Basis-Klasse, die die Fassade "Punkte" zu.
Dieser gibt einem Entwickler die Möglichkeit zum "mock" - Fassade - durch den Wechsel der Basis-Klasse mit einem mock-Objekt.
In diesem Sinne, können Sie diese verwenden, und haben immer noch testbaren code. Dies ist, wo einige Verwirrung liegt in der PHP community.
DI ist oft zitiert werden, machen Sie Ihren code getestet - Sie machen mocking-Klasse Abhängigkeiten einfach. (Sidenote: Schnittstellen und DI haben andere wichtige Gründe für die vorhandenen!)
Fassaden, auf der anderen Seite, sind oft zitiert werden, macht die Prüfung schwieriger, weil man nicht "einfach Spritzen, ein mock-Objekt", was auch immer code, den Sie testen wollen. Jedoch, wie bereits erwähnt, können Sie in der Tat "mock" Sie.
Fassade vs DI
Dies ist, wo Menschen sind verwirrt darüber, ob die Fassaden sind eine alternative zu DI oder nicht.
In einem Sinn, Sie beide eine Abhängigkeit zur Klasse - Sie können entweder DI-hinzufügen einer Abhängigkeit oder Sie können eine Fassade direkt -
FacadeName::method($param);
. (Hoffentlich sind Sie nicht instanziieren einer Klasse direkt innerhalb der anderen 😀 ).Dies nicht machen, Fassaden eine alternative zu DI, sondern stattdessen innerhalb von Laravel, hat eine situation schaffen, wo können Sie entscheiden zum hinzufügen von Klassen-Abhängigkeiten eine der 2 Möglichkeiten - entweder mit DI-oder durch die Verwendung einer Fassade. (Sie können natürlich auch noch andere Möglichkeiten. Diese "2 ways" sind nur die meisten-Häufig verwendete "testbar Weg").
Laravel Fassaden sind eine Implementierung des Service-Locator-Muster, nicht die Fassade Muster.
Meiner Meinung nach sollten Sie vermeiden, service-locator innerhalb Ihrer domain, die sich nur verwenden Sie es in Ihrer service-und web-transport-Schichten.
http://martinfowler.com/articles/injection.html#UsingAServiceLocator
Ich denke, dass in Bezug auf laravel Fassaden, die Ihnen helfen, halten Sie den code einfach und noch testbar, da kann man mock Fassaden jedoch vielleicht ein bisschen schwieriger zu sagen ein Controller-Abhängigkeiten wenn Sie die Fassaden da sind Sie wohl alle über dem Platz in Ihrem code.
Mit dependency injection, die Sie schreiben müssen, ein bisschen mehr code, da müssen Sie den Umgang mit der Erstellung von Schnittstellen und Dienste um mit der depenancies aber Seine viel mehr klar, was Sie später einen controller hängt davon ab, da diese deutlich erwähnt in der controller-Konstruktor.
Ich denke, es ist eine Frage der Entscheidung, welche Methode Sie bevorzugen die Verwendung von