Was ist Fassade in Laravel?

黄舟
Freigeben: 2023-03-16 10:52:01
Original
2438 Leute haben es durchsucht

Facade ist eigentlich ein statischer Proxy einer Klasse in einem Container. Es ermöglicht Ihnen, jede Methode jedes im Container gespeicherten Objekts statisch aufzurufen. Der folgende Artikel enthält hauptsächlich relevante Informationen zum Ladevorgang und zum Prinzip von Facade in Laravel. Freunde in Not können darauf zurückgreifen.

Was ist Fassade in Laravel?

Die Definition im offiziellen Dokument

„Fassaden bieten eine „statische“ Schnittstelle. Laravel verfügt über viele Fassaden, die den Zugriff auf die meisten Funktionen ermöglichen. Laravel-Fassaden sind eigentlich „statische Proxys“ für die zugrunde liegenden Klassen im Service-Container. Im Vergleich zu herkömmlichen statischen Methoden können sie bei ihrer Verwendung eine flexiblere, einfacher zu testende und elegantere Syntax bieten. ”

Sie müssen keine lange Liste von Namespaces verwenden oder das Objekt instanziieren, um auf die spezifischen Methoden des Objekts zuzugreifen.

use Config;

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

Fassadenstart und Registrierung

Der Startup-Boot von Facade wird 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();
}
Nach dem Login kopieren

Die Standard-Alias-Konfiguration wird aus den Aliasen unter der App-Konfigurationsdatei gelesen, und das PackageManifest ist 5.5 verfügt über neue automatische Erkennungsregeln für Pakete.

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 wird für das automatische Laden über AliasLoader registriert. Der Kern ist PHPs spl_autoload_register. Nach Abschluss der Registrierung werden alle nachfolgenden Nutzungsklassen automatisch geladen >

Hinweis:
 /**
 * 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

Bei der Definition von spl_autoload_register wird der letzte Parameter als wahr übergeben. Wenn dieser Parameter wahr ist, fügt spl_autoload_register() die Funktion der Warteschlange hinzu, nicht dem Ende die Warteschlange (das automatische Laden wird zuerst durch diese Funktion abgeschlossen)

Mit anderen Worten: Egal welche spezifische 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 hauptsächlich die Funktion class_alias verwendet Automatisches Laden von Aliasen implementieren

Hier ist ein offizielles Beispiel für class_alias:

<?php

use Config;
use App\User;

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

Fassadenladen

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

Wann Wir verwenden die Fassade, wie zum 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

Die IlluminateSupportFacadesConfig-Klasse wird tatsächlich geladen (da wir class_alias registriert haben), was durchaus der Fall ist. In:
Alle Fassaden erben von der IlluminateSupportFacadesFacade-Klasse und eine __callStatic-Methode sind in dieser Basisklasse definiert, sodass wir die Facade problemlos verwenden können (ohne Instanziierung).

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:
<?php

use Config;

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

<?php

use Illuminate\Support\Facades\Config;

class Test
{
 public function index()
 {
  Config::get(&#39;app.name&#39;);
 }
}
Nach dem Login kopieren
String-Typ-String (z. B. config, db)

<?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

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

  • Objektspezifisches Instanziierungsobjekt

  • Schließungsverschluss

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

  • Die getFacadeRoot-Methode ruft das entsprechende reale Spaltenobjekt aus dem Container basierend auf dem Rückgabewert von

    ab.

Da die Konfigurationsinstanzspalte

protected static function getFacadeAccessor()
{
 return &#39;config&#39;;
}
Nach dem Login kopieren
im APP-Container registriert wurde,

greift sie tatsächlich auf die Methode getFacadeAccessor() der Repository-Instanzspalte zu.

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
Weitere Informationen zu diesem Thema finden Sie auf der

PHP-Website für Chinesisch

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

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

Das obige ist der detaillierte Inhalt vonWas ist Fassade 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