Einführung in den Ladevorgang und das Prinzip von Facade in Laravel

巴扎黑
Freigeben: 2023-03-16 11:46:01
Original
1459 Leute haben es durchsucht

Facade ist eigentlich ein statischer Proxy einer Klasse im Container. Damit können Sie jede Methode jedes im Container gespeicherten Objekts statisch aufrufen. Der folgende Artikel führt Sie hauptsächlich in den Ladevorgang von Facade in Laravel ein Auf den Grundsatz können sich Freunde in Not berufen.

Vorwort

In diesem Artikel werden hauptsächlich die relevanten Inhalte zum Fassadenladeprozess und den Prinzipien in Laravel vorgestellt und als Referenz und Studium weitergegeben Im Folgenden gibt es nicht viel zu sagen. Werfen wir einen Blick auf die ausführliche Einführung.

Einführung

Fassaden (ausgesprochen: /fəˈsäd/) bieten eine „statische“ Schnittstelle. Sie müssen nicht viele Namespaces verwenden oder das Objekt instanziieren, um auf seine spezifischen Methoden zuzugreifen.


use Config;

class Test
{
 public function index()
 {
 return Config::get('app.name');
 }
}
Nach dem Login kopieren

Fassadeninbetriebnahme und Registrierung

Fassadeninbetriebnahmeanleitung ist in Registriert in IlluminateFoundationBootstrapRegisterFacades.


public function bootstrap(Application $app)
{
 Facade::clearResolvedInstances();
 Facade::setFacadeApplication($app);

 AliasLoader::getInstance(array_merge(
 $app->make('config')->get('app.aliases', []),
 $app->make(PackageManifest::class)->aliases()
 ))->register();
}
Nach dem Login kopieren

Die Standard-Aliaskonfiguration wird aus Aliasen unter der App-Konfigurationsdatei gelesen. PackageManifest ist eine neue Regel zur automatischen Paketerkennung in Laravel 5.5. Wir werden es tun Berücksichtigen Sie vorerst nicht die vom PackageManifest-Paket bereitgestellten Aliase.

Unter diesen gibt array_merge ein Array im folgenden Format zurück:


 "App" => "Illuminate\Support\Facades\App"
 "Artisan" => "Illuminate\Support\Facades\Artisan"
 "Auth" => "Illuminate\Support\Facades\Auth"
 "Blade" => "Illuminate\Support\Facades\Blade"
 ...
Nach dem Login kopieren

Der obige Code registriert alle Fassaden für das automatische Durchladen AliasLoader. Der Kern ist das spl_autoload_register von PHP.


 /**
 * Prepend the load method to the auto-loader stack.
 *
 * @return void
 */
 protected function register()
 {
 if (! $this->registered) {
  spl_autoload_register([$this, 'load'], true, true);

  $this->registered = true;
 }
 }
Nach dem Login kopieren

Nach Abschluss der Registrierung werden alle nachfolgenden Nutzungsklassen automatisch über die Ladefunktion geladen.

Hinweis: Bei der Definition von spl_autoload_register hier ist der letzte übergebene Parameter wahr. Wenn dieser Parameter wahr ist, fügt spl_autoload_register() die Funktion dem Kopf der Warteschlange statt dem Ende hinzu. (Das automatische Laden wird zuerst durch diese Funktion abgeschlossen)

Mit anderen Worten:


<?php

use Config;
use App\User;

class Test
{
 public function index()
 {
 Config::get(&#39;app.name&#39;);
 new User();
 }
}
Nach dem Login kopieren

Egal welche spezifische vorhandene Klasse wir verwenden ( AppUser) oder Alias ​​(Config), das automatische Laden wird zuerst durch die Ladefunktion abgeschlossen. Wenn die Funktion false zurückgibt, wird das automatische Laden durch andere automatische Ladefunktionen (z. B. Composer PSR-4) abgeschlossen.

In der Lademethode von AliasLoader wird die Funktion class_alias hauptsächlich zum Implementieren des automatischen Ladens von Aliasen verwendet.


public function load($alias)
{
 if (isset($this->aliases[$alias])) {
 return class_alias($this->aliases[$alias], $alias);
 }
}
Nach dem Login kopieren

Über class_alias gibt es hier ein offizielles Beispiel:


class foo { }

class_alias(&#39;foo&#39;, &#39;bar&#39;);

$a = new foo;
$b = new bar;

// the objects are the same
var_dump($a == $b, $a === $b); //true
var_dump($a instanceof $b); //false

// the classes are the same
var_dump($a instanceof foo); //true
var_dump($a instanceof bar); //true

var_dump($b instanceof foo); //true
var_dump($b instanceof bar); //true
Nach dem Login kopieren

Laden der Fassade

Wenn wir Facade verwenden, wie zum Beispiel:


<?php

use Config;

class Test
{
 public function index()
 {
 Config::get(&#39;app.name&#39;);
 }
}
Nach dem Login kopieren

tatsächlich geladen Es ist die IlluminateSupportFacadesConfig Klasse (weil wir class_alias registriert haben), was äquivalent ist zu:


<?php

use Illuminate\Support\Facades\Config;

class Test
{
 public function index()
 {
  Config::get(&#39;app.name&#39;);
 }
}
Nach dem Login kopieren

Und alle Facades erben von der IlluminateSupportFacadesFacade-Klasse, die in dieser Basisklasse A __callStatic definiert ist Mit der Methode können wir die Fassade einfach verwenden (ohne Instanziierung).


<?php

public static function __callStatic($method, $args)
{
 $instance = static::getFacadeRoot();

 if (! $instance) {
  throw new RuntimeException(&#39;A facade root has not been set.&#39;);
 }

 return $instance->$method(...$args);
}
Nach dem Login kopieren

Die getFacadeRoot-Methode wird verwendet, um die spezifische Instanzspalte der Alias-Klasse abzurufen. Wir wissen, dass alle Facade-Klassen eine getFacadeAccessor-Methode definieren müssen. Mögliche Rückgabewerte dieser Methode sind:

  • String-Typ-String (z. B. config, db)

  • String-Typ string-like ( wie z. B. AppServiceSomeService)

  • Objektspezifisches Instanziierungsobjekt

  • Schließungsverschluss

wie z Die getFacadeAccessor-Methode von Config Facade lautet wie folgt:


protected static function getFacadeAccessor()
{
 return &#39;config&#39;;
}
Nach dem Login kopieren

Die getFacadeRoot-Methode ruft das entsprechende reale Spaltenobjekt aus dem Container basierend auf dem Rückgabewert von getFacadeAccessor() ab .


public static function getFacadeRoot()
{
 $name = static::getFacadeAccessor();
 
 if (is_object($name)) {
  return $name;
 }

 if (isset(static::$resolvedInstance[$name])) {
  return static::$resolvedInstance[$name];
 }

 return static::$resolvedInstance[$name] = static::$app[$name];
}
Nach dem Login kopieren

Da die eigentliche Konfigurationsspalte im APP-Container registriert wurde


<?php
//Illuminate\Foundation\Bootstrap/LoadConfiguration

$app->instance(&#39;config&#39;, $config = new Repository($items));
Nach dem Login kopieren

also Config::get('app.name', 'dafault) Der eigentliche Zugriff ist die get('app.name', 'default') -Methode der Repository-Instanzspalte.

Das obige ist der detaillierte Inhalt vonEinführung in den Ladevorgang und das Prinzip von Facade in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!