2016-07-25 24 views
0

Ich weiß, wie ein Inversion of Control-Container funktioniert und ich weiß, wie ich einen selbst erstellen kann. Aber ich weiß nur, wie man das macht, indem ich Register- und Entschlossenheitsmethoden benutze.Wie löst Laravel Abhängigkeiten basierend auf Typhinweisen auf?

Ich habe in der Laravel-Dokumentation nachgeschaut, aber ich bin auf der Suche, herauszufinden, wie Laravel eine Abhängigkeit basierend auf Tyhinhinting lösen kann. Wo ist das fehlende Glied für genau diesen Teil?

Wenn ich einen traditionelleren IoC-Container verwende, in dem ich manuell Dinge auflösche, muss ich zumindest eine statische Methode aufrufen, um loszulegen. Laravel scheint das alles nicht zu brauchen.

Kann mich jemand in die richtige Richtung lenken oder ein kleines Beispiel aufstellen?

ich habe mich durchgearbeitet:

http://code.tutsplus.com/tutorials/dependency-injection-huh--net-26903

Als rekapitulieren. Vielleicht könnte jemand ein schnelles Beispiel mit automatischer Auflösung für Typhinweisen aufstellen oder ist das wirklich komplex?

+1

Für Ihre Frage, es sieht so aus, als ob Sie wissen möchten, wie Laravel DI durch Typhinweis auflöst. Was Sie suchen, heißt Reflection in PHP. Mit Reflection erstellen Sie ein Spiegelobjekt einer Klasse innerhalb einer Variablen und Sie können durch es navigieren, bevor Sie eine Instanz erstellen. –

+0

Wie feuert die Reflexionsklasse, wenn ein Typhint verwendet wird? –

+1

ist es nicht. Wenn Sie aufmerksam auf Laravel achten, haben Sie nur DI für Klassen/Methoden, die Laravel für Sie aufruft. Wenn Sie ein Objekt manuell instanziieren, sehen Sie, dass DI Sie nicht speichert. –

Antwort

3

Die Magie passiert in Laravels Container.php Klasse, in der Abhängigkeiten automatisch durch Reflexion aufgelöst werden.

Nur Klassen, die mit Laravels DI-Container instanziiert oder "gemacht" werden, profitieren von der Abhängigkeitsinjektionsfunktion.

+0

Ich vermute, dass alle Controller einfach auf Basis des Routers instanziiert werden, der einen URL- und Controllernamen empfängt. Wo passiert dieser Teil? Die eigentliche "new up" -Anweisung für eine Controller-Instanz. Wann verbindet sich ein Controller mit dem Container, damit er die Reflektion aus dem Container verwenden kann? –

+0

Dies alles geschieht in der 'build()' Methode. Alle Klassen, die von Laravels DI-Container erstellt werden, sind innerhalb dieser Methode konstruiert. Es gibt 2 Rückkehrpunkte innerhalb dieser Methode. Der erste befindet sich in [Zeile 761] (https://github.com/laravel/framework/blob/5.2/src/Illuminate/Container/Container.php#L761), wo das instanziierte Objekt mit dem Schlüsselwort 'new' erstellt wird Für die Klasse ist keine '__construct()' -Methode definiert. Der zweite Rückkehrpunkt ist [Zeile 779] (https://github.com/laravel/framework/blob/5.2/src/Illuminate/Container/Container.php#L779), wo die Klasse mit Argumenten instanziiert wird. –