Maison > Article > développement back-end > Qu’est-ce que la façade dans Laravel ?
Facade est en fait un proxy statique d'une classe dans un conteneur. Il vous permet d'appeler statiquement n'importe quelle méthode de n'importe quel objet stocké dans le conteneur. L'article suivant vous présente principalement les informations pertinentes sur le processus de chargement et le principe de Facade dans Laravel. Les amis dans le besoin peuvent s'y référer.
La définition donnée par le document officiel
« Les façades offrent une interface « statique ». Laravel est livré avec de nombreuses façades qui donnent accès à la plupart des fonctionnalités. Les façades Laravel sont en fait des « proxys statiques » pour les classes sous-jacentes dans le conteneur de services. Par rapport aux méthodes statiques traditionnelles, elles peuvent fournir une syntaxe plus flexible, plus facile à tester et plus élégante lorsqu'elles sont utilisées. ”
Vous n'avez pas besoin d'utiliser une longue liste d'espaces de noms ou d'instancier l'objet pour accéder aux méthodes spécifiques de l'objet.
use Config; class Test { public function index() { return Config::get('app.name'); } }
Démarrage de façade et enregistrement
Le démarrage de Facade est enregistré dans 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(); }
La configuration d'alias par défaut est lue à partir des alias sous le fichier de configuration de l'application, et le PackageManifest l'est. 5.5 a de nouvelles règles de découverte automatique des packages. Ici, nous ne prenons pas en compte les alias fournis par le package PackageManifest pour l'instant
Parmi eux, array_merge renvoie un tableau au format suivant :
"App" => "Illuminate\Support\Facades\App" "Artisan" => "Illuminate\Support\Facades\Artisan" "Auth" => "Illuminate\Support\Facades\Auth" "Blade" => "Illuminate\Support\Facades\Blade" ....
Le code ci-dessus. Toutes les façades seront enregistrées pour le chargement automatique via AliasLoader. Le noyau est spl_autoload_register de php. Une fois l'enregistrement terminé, toutes les classes d'utilisation suivantes seront automatiquement chargées via la fonction de chargement 🎜>
/** * 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; } }Remarque : Lors de la définition de spl_autoload_register ici, le dernier paramètre passé est vrai. Lorsque ce paramètre est vrai, spl_autoload_register() ajoutera la fonction à la file d'attente, plutôt qu'à la fin. file d'attente (le chargement automatique est effectué en premier via cette fonction)
En d'autres termes,
Peu importe la classe spécifique que nous utilisons (AppUser) ou l'alias (Config), automatique le chargement sera d'abord effectué via la fonction de chargement. Lorsque la fonction renvoie false, le chargement automatique sera complété par d'autres fonctions de chargement automatique (telles que composer psr-4. Dans la méthode de chargement d'AliasLoader, la fonction class_alias est principalement utilisée pour implémenter). chargement automatique des alias
<?php use Config; use App\User; class Test { public function index() { Config::get('app.name'); new User(); } }
Chargement de façade
public function load($alias) { if (isset($this->aliases[$alias])) { return class_alias($this->aliases[$alias], $alias); } }Quand on utilisez Facade, tel que :
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
En fait, la classe IlluminateSupportFacadesConfig est chargée (car nous avons enregistré class_alias), ce qui est tout à fait In :
<?php use Config; class Test { public function index() { Config::get('app.name'); } }La méthode getFacadeRoot est utilisée pour obtenir la colonne d'instance spécifique de la classe alias Nous savons que toutes les classes Facade doivent définir une méthode getFacadeAccessor. Les valeurs de retour possibles de cette méthode sont :
<?php use Illuminate\Support\Facades\Config; class Test { public function index() { Config::get('app.name'); } }
String type string (tel que config, db)
<?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); }String type string-like ( tels que Tels que AppServiceSomeService)
La méthode getFacadeRoot récupérera l'objet colonne réel correspondant du conteneur en fonction de la valeur de retour de
.Puisque la colonne d'instance de configuration
protected static function getFacadeAccessor() { return 'config'; }
a été enregistrée dans le conteneur APP, getFacadeAccessor()
accède en fait à la méthode
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]; }
Pour plus de connaissances connexes, veuillez visiter le
Site Web PHP chinois<?php //Illuminate\Foundation\Bootstrap/LoadConfiguration $app->instance('config', $config = new Repository($items));! !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!