Maison >cadre php >Laravel >Interprétation détaillée de Laravel Facade

Interprétation détaillée de Laravel Facade

藏色散人
藏色散人avant
2020-11-09 15:26:032361parcourir

Ce qui suit est une explication détaillée de Laravel Facade de la colonne du didacticiel Laravel . J'espère que cela aidera ceux qui en ont besoin !

Interprétation détaillée de Laravel Facade

Bonjour à tous, le contenu d'aujourd'hui concerne le principe d'implémentation du mécanisme Facade de Laravel.

Utilisation simple de la façade

Utilisation de la base de données :

$users = DB::connection('foo')->select(...);

Conteneur IOC

Comme nous le savons tous, le conteneur IOC est la partie la plus importante du Cadre Laravel. Il fournit deux fonctions, IOC et conteneurs.

  • IOC (Inversion de Contrôle), aussi appelé inversion de contrôle. Pour parler franchement, il s'agit de contrôler la génération d'objets afin que les développeurs n'aient pas à se soucier de la manière dont les objets sont générés, mais seulement de leur utilisation.
  • L'instance d'objet générée via le mécanisme IOC a besoin d'un emplacement de stockage pour une utilisation continue, ce qui est sa fonction de conteneur.

Cette fois, je ne vais pas expliquer l'implémentation spécifique du conteneur IOC. Il y aura un article l'expliquant en détail plus tard. Concernant les conteneurs IOC, les lecteurs n'ont qu'à retenir deux points :

  1. Générer des instances d'objet selon la configuration
  2. Enregistrer les instances d'objet pour un accès facile à tout moment
 ;

Classe Facade simplifiée

<?php
namespace facades;

abstract class Facade
{
    protected static $app;

    /** 
     * Set the application instance.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public static function setFacadeApplication($app)
    {   
        static::$app = $app;
    } 

    /** 
     * Get the registered name of the component.
     *
     * @return string
     *
     * @throws \RuntimeException
     */
    protected static function getFacadeAccessor()
    {
        throw new RuntimeException(&#39;Facade does not implement getFacadeAccessor method.&#39;);
    }

    /** 
     * Get the root object behind the facade.
     *
     * @return mixed
     */
    public static function getFacadeRoot()
    {   
        return static::resolveFacadeInstance(static::getFacadeAccessor());
    } 

    /**
     * Resolve the facade root instance from the container.
     *
     * @param  string|object  $name
     * @return mixed
     */
    protected static function resolveFacadeInstance($name)
    {
        return static::$app->instances[$name];
    }

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

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

        switch (count($args)) {
            case 0:
                return $instance->$method();
            case 1:
                return $instance->$method($args[0]);
            case 2:
                return $instance->$method($args[0], $args[1]);
            case 3:
                return $instance->$method($args[0], $args[1], $args[2]);
            case 4:
                return $instance->$method($args[0], $args[1], $args[2], $args[3]);
            default:
                return call_user_func_array([$instance, $method], $args);
        } 
    }
}

Description du code :

  1. Ce qui est stocké dans $app est une instance de conteneur IOC, qui est transmise via setFacadeApplication() Le
  2. défini par cette méthode statique implémente la méthode magique __callStatic
  3. la méthode getFacadeAccessor() doit être héritée par les sous-classes et renvoie un identifiant de chaîne Grâce à cet identifiant, le conteneur IOC peut renvoyer l'objet de la classe. il est lié à (initialisation du framework ou liaison à d'autres moments)
  4. appelle des méthodes spécifiques via $instance

pour créer sa propre façade :

TEST1 La logique spécifique :

<?php
class Test1{
	public function hello()
	{
		print("hello world");
	}}

Classe TEST1 Façade :

<?php
namespace facades;/**
 * Class Test1
 * @package facades
 *
 * @method static setOverRecommendInfo [设置播放完毕时的回调函数]
 * @method static setHandlerPlayer [明确指定下一首时的执行类]
 */class Test1Facade extends Facade{
    protected static function getFacadeAccessor()
    {   
        return &#39;test1&#39;;
    }   }

Utilisation :

use facades\Test1Facade;Test1Facade::hello();  // 这是 Facade 调用

Explication :

  1. facadesTest1Facade appelle la méthode statique hello() Quand, depuis cette méthode n'est pas définie, __callStatic sera appelée ;
  2. Dans __callStatic, l'instance correspondante est d'abord obtenue, c'est-à-dire return static::$app->instances[$name];. Parmi eux, $name est test1facadesTest1
  3. $app dans
  4. , qui est le conteneur IOC, et le processus d'instanciation de la classe est géré par celui-ci.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer