Inhaltsverzeichnis
Artikel, die Sie interessieren könnten:
Heim Backend-Entwicklung PHP-Tutorial Analysieren Sie Inhalte im Zusammenhang mit der Laravel-Abhängigkeitsinjektion mithilfe des Quellcodes

Analysieren Sie Inhalte im Zusammenhang mit der Laravel-Abhängigkeitsinjektion mithilfe des Quellcodes

Jun 29, 2018 pm 05:40 PM
laravel 依赖注入

Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen zum Parsen der Abhängigkeitsinjektion von Laravel durch den Quellcode ein. Es hat einen gewissen Referenz-Lernwert für alle, die es brauchen können Sie Let’s learning gemeinsam mit dem Herausgeber verfolgen.

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.

Im Controller-Konstruktor oder in der Member-Methode von Laravel kann die Abhängigkeitsinjektion durch Typbeschränkungen verwendet werden, wie zum Beispiel:

public function store(Request $request)
{
 //TODO
}
Nach dem Login kopieren

Der $request-Parameter hier verwendet Typbeschränkungen. 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');
Nach dem Login kopieren

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));
}
Nach dem Login kopieren

Erste Methode „resolveClassMethodDependencies“, „as Der Name deutet darauf hin, dass es darum geht, das abhängige Objekt gemäß den Methodenparametern der Klasse abzurufen, dann die Methode der Klasse aufzurufen und die Objektparameter einzufügen.

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

Holen Sie sich den Code für das abhängige Objektbeispiel:

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

Der entscheidende Punkt hier ist die Verwendung der PHP-Reflexion. Achten Sie auf die RelectionMethod Methode, die die Parameterliste der Klassenmethode abruft, können Sie die Parametertypbeschränkungen, 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

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);
 }
}
Nach dem Login kopieren

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)
 {
 }
}
Nach dem Login kopieren

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

Sie können die Parameterliste dieser Methode und den Einschränkungstyp des Parameters abrufen, z. B. typeHint, IlluminateHttpRequest.

Entsprechend dem Klassennamen können Sie die anfänglich gebundene Instanz über abrufen Dienstleister aus dem Container.

Zusammenfassung

Artikel, die Sie interessieren könnten:

php-Datenstruktur Beispiele für sequentielle verknüpfte Listen und verknüpfte lineare Listen

Detaillierte Erläuterung des Unterschieds zwischen der Verwendung von Kommas und Punkten für Echo in PHP

Beispiel einer PHP-Implementierung zum Zählen der Anzahl von Einsen im binären Algorithmus

Das obige ist der detaillierte Inhalt vonAnalysieren Sie Inhalte im Zusammenhang mit der Laravel-Abhängigkeitsinjektion mithilfe des Quellcodes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP vs. Flutter: Die beste Wahl für die mobile Entwicklung PHP vs. Flutter: Die beste Wahl für die mobile Entwicklung May 06, 2024 pm 10:45 PM

PHP vs. Flutter: Die beste Wahl für die mobile Entwicklung

Laravel – Handwerkerbefehle Laravel – Handwerkerbefehle Aug 27, 2024 am 10:51 AM

Laravel – Handwerkerbefehle

Analyse der Vor- und Nachteile von PHP-Unit-Test-Tools Analyse der Vor- und Nachteile von PHP-Unit-Test-Tools May 06, 2024 pm 10:51 PM

Analyse der Vor- und Nachteile von PHP-Unit-Test-Tools

Wie verwende ich objektrelationales Mapping (ORM) in PHP, um Datenbankoperationen zu vereinfachen? Wie verwende ich objektrelationales Mapping (ORM) in PHP, um Datenbankoperationen zu vereinfachen? May 07, 2024 am 08:39 AM

Wie verwende ich objektrelationales Mapping (ORM) in PHP, um Datenbankoperationen zu vereinfachen?

Architektur und Praxis verteilter PHP-Systeme Architektur und Praxis verteilter PHP-Systeme May 04, 2024 am 10:33 AM

Architektur und Praxis verteilter PHP-Systeme

Vergleich der neuesten Versionen von Laravel und CodeIgniter Vergleich der neuesten Versionen von Laravel und CodeIgniter Jun 05, 2024 pm 05:29 PM

Vergleich der neuesten Versionen von Laravel und CodeIgniter

Wie vergleichen sich die Datenverarbeitungsfunktionen in Laravel und CodeIgniter? Wie vergleichen sich die Datenverarbeitungsfunktionen in Laravel und CodeIgniter? Jun 01, 2024 pm 01:34 PM

Wie vergleichen sich die Datenverarbeitungsfunktionen in Laravel und CodeIgniter?

PHP-Code-Unit-Tests und Integrationstests PHP-Code-Unit-Tests und Integrationstests May 07, 2024 am 08:00 AM

PHP-Code-Unit-Tests und Integrationstests

See all articles