Heim  >  Artikel  >  Backend-Entwicklung  >  Beispiel für das Parsen der Abhängigkeitsinjektion von Laravel

Beispiel für das Parsen der Abhängigkeitsinjektion von Laravel

小云云
小云云Original
2018-01-24 13:09:082595Durchsuche

Wie wir alle wissen, gibt es unzählige PHP-Frameworks. In den letzten Jahren wurde ein Framework, das für seine Eleganz bekannt ist, nach und nach von inländischen PHP-Benutzern genutzt. Ein offensichtliches Manko von Larave ist jedoch, dass sein Dokumentationsinhalt erbärmlich. Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen zum Analysieren der Abhängigkeitsinjektion durch Quellcode ein. Der Artikel stellt ihn ausführlich anhand von Beispielcode vor. Ich hoffe, dass er jedem helfen kann.

Im Konstruktor oder in der Member-Methode des Laravel-Controllers kann die Abhängigkeitsinjektion über Typbeschränkungen verwendet werden, wie zum Beispiel:

public function store(Request $request)
{
 //TODO
}

Hier verwendet der Parameter $request Typbeschränkungen, Request ist eine Klasse : IlluminateHttpRequest, was angibt, dass die Parameter dieser Klasse oder einer Unterklasse angehören müssen.

In diesem Artikel wird der Quellcode von Laravel analysiert, um herauszufinden, warum Request direkt verwendet werden kann, ohne eine Instanz in der Methode zu übergeben. Es ist nur so, dass das Framework automatisch Parameter für uns instanziiert und übergibt.

1. Routendefinition

Ausgehend von der Quelle wird eine solche Route in der Routendefinitionsdatei definiert:

Route::resource('/role', 'Admin\RoleController');

Dies ist eine ressourcenbasierte Route generiert automatisch Routing-Einträge für Hinzufügungen, Löschungen, Änderungen und Abfragen.

Die Store-Methode am Anfang dieses Artikels ist eine Controller-Methode. Die durch die Route definierte Aktion ist in der Abbildung zu sehen: AppHttpControllersAdminRoleController@store

Analyse der Routenmethode

Suchen Sie den Controller und die Methode gemäß der Routendefinition und führen Sie die spezifische Methode in der Versandmethode aus.

(Datei: seller/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php)

public function dispatch(Route $route, $controller, $method)
{
 $parameters = $this->resolveClassMethodDependencies(
  $route->parametersWithoutNulls(), $controller, $method
 );
 
 if (method_exists($controller, 'callAction')) {
  return $controller->callAction($method, $parameters);
 }
 
 return $controller->{$method}(...array_values($parameters));
}

Die erste Methode „resolveClassMethodDependencies“ dient „wie der Name schon sagt“ dazu, abhängige Objekte abzurufen auf den Methodenparametern der Klasse, rufen Sie dann die Klassenmethode auf und fügen Sie die Objektparameter ein.

Wenn mehrere abhängige Objekte vorhanden sind, werden diese nacheinander von foreach analysiert und als Parameter eingefügt.

Rufen Sie den Code für das abhängige Objektbeispiel ab:

protected function resolveClassMethodDependencies(array $parameters, $instance, $method)
{
 if (! method_exists($instance, $method)) {
  return $parameters;
 }
 
 return $this->resolveMethodDependencies(
  $parameters, new ReflectionMethod($instance, $method)
 );
}

Der entscheidende Punkt hier ist die Verwendung der PHP-Reflexion. Achten Sie auf die RelectionMethod-Methode, die die Methodenparameterliste des abruft Klasse und kann die Typbeschränkungen der Parameter, Parameternamen usw. kennen.

Der $instance-Parameter ist hier die RoleController-Controllerklasse und der $method-Parameter ist der Methodennamenspeicher.

2. Beispiel für den Erhalt abhängiger Objekte

Beziehen Sie ihn von die Parameter der Methode Sobald Sie den Einschränkungstyp des abhängigen Objekts kennen, können Sie das abhängige Objekt instanziieren.

protected function transformDependency(ReflectionParameter $parameter, $parameters)
{
 $class = $parameter->getClass(); 
 // If the parameter has a type-hinted class, we will check to see if it is already in
 // the list of parameters. If it is we will just skip it as it is probably a model
 // binding and we do not want to mess with those; otherwise, we resolve it here.
 if ($class && ! $this->alreadyInParameters($class->name, $parameters)) {
  return $parameter->isDefaultValueAvailable()
   ? $parameter->getDefaultValue()
   : $this->container->make($class->name);
 }
}

Holen Sie sich das Objekt aus dem Container basierend auf dem Klassennamen. Der Prozess der Bindung der Objektinstanz wird zunächst im Dienstanbieter definiert.

Übergeben Sie dann das instanziierte Objekt an die Store-Methode und Sie können das abhängige Objekt verwenden.

3. Über PHP-Reflexion

Geben Sie ein Beispiel für die Verwendung von ReflectionMethod.

class Demo
{
 private $request;
 public function store(Request $request)
 {
 }
}

Drucken Sie den Inhalt der neuen ReflectionMethod(Demo::class, 'store') aus, wie in der Abbildung gezeigt:

Sie können erhalten Die Parameter dieser Methode werden aufgelistet, Parametereinschränkungstypen wie typeHint, IlluminateHttpRequest.

Gemäß dem Klassennamen kann die zunächst über den Dienstanbieter gebundene Instanz aus dem Container abgerufen werden.

Verwandte Empfehlungen:

Eine kurze Diskussion über die benutzerdefinierte Abhängigkeitsinjektion des Lumen-Frameworks

PHP implementiert die automatische Abhängigkeitsinjektion basierend auf Reflexionsmechanismus Detaillierte Erläuterung der method_php-Fähigkeiten

Wie man mit js die Abhängigkeitsinjektion implementiert

Das obige ist der detaillierte Inhalt vonBeispiel für das Parsen der Abhängigkeitsinjektion von Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn