Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Quellcode-Analyse und der Laravel-Abhängigkeitsinjektionsschritte

Detaillierte Erläuterung der Quellcode-Analyse und der Laravel-Abhängigkeitsinjektionsschritte

php中世界最好的语言
php中世界最好的语言Original
2018-05-19 14:22:411495Durchsuche

Dieses Mal werde ich Ihnen eine detaillierte Erläuterung der Schritte zur Quellcode-Analyse von Laravel Abhängigkeitsinjektion und den Vorsichtsmaßnahmen für die Quellcode-Analyse von Laravel-Abhängigkeitsinjektion geben. Das Folgende ist a Praktischer Fall, werfen wir einen Blick darauf.

Vorwort

Wie wir alle wissen, gibt es unzählige PHP-Frameworks. In den letzten Jahren ist nach und nach ein Framework bekannt geworden, das für seine Eleganz bekannt ist an inländische PHPer und begann, es zu verwenden, aber ein offensichtlicher Mangel von Larave ist, dass sein Dokumentationsinhalt erbärmlich ist.

Dieser Artikel gibt Ihnen eine detaillierte Einführung in die Laravel-Abhängigkeitsinjektion und stellt sie Ihnen als Referenz und zum Studium zur Verfügung. Ich werde im Folgenden nicht viel sagen, werfen wir einen Blick auf die detaillierte Einführung.

In der Konstruktormethode oder Mitgliedsmethode des Laravel-Controllers können Sie die Abhängigkeitsinjektion über Typbeschränkungen verwenden, wie zum Beispiel:

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

Der $request-Parameter Hier werden Typbeschränkungen verwendet. Request ist eine Klasse: IlluminateHttpRequest, was bedeutet, dass der Parameter diese Klasse oder eine Unterklasse sein muss.

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, die automatisch Routing-Einträge zum Hinzufügen, Löschen, Ändern und Abfragen generiert.

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

Routenmethode Analysieren Sie

, um den Controller und die Methode gemäß der Routendefinition zu finden, 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“ besteht „wie der Name schon sagt“ darin, abhängige Objekte basierend auf zu erhalten Methodenparameter der Klasse und dann 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. Sie erhält die Methodenparameterliste der Klasse kann die Typbeschränkungen der Parameter Name 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

Nachdem Sie den Einschränkungstyp des abhängigen Objekts aus dem Methodenparameter erhalten haben, 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-Reflektion

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 den Parameter abrufen Liste dieser Methode, Der Einschränkungstyp des Parameters, z. B. typeHint, IlluminateHttpRequest.

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

Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Empfohlene Lektüre:

Detaillierte Erläuterung der Verwendung der PHP-Datenstruktur und der sequentiell verknüpften Liste und der verknüpften linearen Liste

PHP-Implementierung der statistischen Binärdatei Detaillierte Erläuterung der Schritte des Zahl-1-Algorithmus

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Quellcode-Analyse und der Laravel-Abhängigkeitsinjektionsschritte. 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