Facade ist eigentlich ein statischer Proxy einer Klasse im Container. Er ermöglicht den statischen Aufruf aller im Container gespeicherten Objekte. Dieser Artikel führt Sie hauptsächlich in den Ladevorgang und das Prinzip von Facade in Laravel ein Informationen, Freunde in Not können sich darauf beziehen. Ich hoffe, es hilft allen.
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'); } }
Facade-Startup und Registrierung
Facade-Startup-Boot ist in IlluminateFoundationBootstrapRegisterFacades registriert.
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(); }
Die Standard-Aliaskonfiguration wird aus Aliasen unter der App-Konfigurationsdatei gelesen. PackageManifest ist eine neue Paket-Autoerkennungsregel in Laravel 5.5. Hier berücksichtigen wir nicht die vom PackageManifest-Paket bereitgestellten vorerst.
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" ...
Der obige Code registriert alle Fassaden für das automatische Laden durch 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; } }
Nachdem die Registrierung abgeschlossen ist, 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('app.name'); new User(); } }
Egal, was wir verwenden, ist eine bestimmte vorhandene Klasse (AppUser) oder ein 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); } }
Über class_alias, hier ist ein offizielles Beispiel:
class foo { } class_alias('foo', 'bar'); $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
Loading of Facade
Wenn wir Facade verwenden, wie zum Beispiel:
<?php use Config; class Test { public function index() { Config::get('app.name'); } }
lädt tatsächlich die IlluminateSupportFacadesConfig-Klasse (da wir class_alias registriert haben), was äquivalent ist zu:
<?php use Illuminate\Support\Facades\Config; class Test { public function index() { Config::get('app.name'); } }
Und alle Facades alle erben von der IlluminateSupportFacadesFacade-Klasse, und in dieser Basisklasse ist eine __callStatic-Methode definiert, sodass wir Facade problemlos verwenden können (ohne Instanziierung).
<?php public static function __callStatic($method, $args) { $instance = static::getFacadeRoot(); if (! $instance) { throw new RuntimeException('A facade root has not been set.'); } return $instance->$method(...$args); }
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 'config'; }
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]; }
Da die Konfigurationsinstanzspalte
<?php //Illuminate\Foundation\Bootstrap/LoadConfiguration $app->instance('config', $config = new Repository($items));
im APP-Container registriert wurde, Config::get('app.name', 'dafault)
greift sie tatsächlich auf die Methode get('app.name', 'default')
der Repository-Instanzspalte zu.
Verwandte Empfehlungen:
Detaillierte Erklärung des Lokalisierungsmoduls von Laravel
Detaillierte Erklärung, wie das Ressourcenrouting in Laravel neu geschrieben wird
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Ladevorgangs und des Prinzips von Facade in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!