Heim >PHP-Framework >Laravel >Detaillierte Interpretation der Laravel-Fassade

Detaillierte Interpretation der Laravel-Fassade

藏色散人
藏色散人nach vorne
2020-11-09 15:26:032366Durchsuche

Das Folgende ist eine detaillierte Erklärung von Laravel Facade aus der LaravelTutorial-Kolumne. Ich hoffe, dass es Freunden in Not hilfreich sein wird!

Detaillierte Interpretation der Laravel-Fassade

Hallo zusammen, im heutigen Inhalt geht es um das Implementierungsprinzip des Facade-Mechanismus von Laravel.

Einfache Verwendung von Facade

Nutzung der Datenbank:

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

IOC-Container

Wie wir alle wissen, ist der IOC-Container der wichtigste Teil des Laravel-Frameworks. Es bietet zwei Funktionen: IOC und Container.

  • IOC (Inversion of Control), auch Inversion of Control genannt. Um es ganz klar auszudrücken: Es geht darum, die Generierung von Objekten zu steuern, sodass sich Entwickler nicht darum kümmern müssen, wie die Objekte generiert werden, sondern nur darum, wie sie verwendet werden.
  • Die durch den IOC-Mechanismus generierte Objektinstanz benötigt einen Speicherort für die weitere Verwendung, bei dem es sich um ihre Containerfunktion handelt.

Die konkrete Implementierung des IOC-Containers werde ich dieses Mal nicht erläutern. Es wird später Artikel geben, die dies ausführlich erläutern. In Bezug auf den IOC-Container müssen sich Leser nur zwei Punkte merken:

  1. Objektinstanzen entsprechend der Konfiguration generieren;
  2. Vereinfachte Fassadenklasse
rreee

Codebeschreibung:


$app speichert eine IOC-Containerinstanz, die bei der Initialisierung des Frameworks über die statische Methode setFacadeApplication() festgelegt wird.
  1. Sie implementiert die magische Methode __callStatic.
  2. Die Methode getFacadeAccessor() erfordert, dass Unterklassen eine Zeichenfolgenkennung erben und zurückgeben . Über diesen Bezeichner kann der IOC-Container das Objekt der Klasse zurückgeben, an die er gebunden ist (Framework-Initialisierung oder andere Zeitbindung).
  3. Spezifische Methoden über $instance aufrufen
  4. Erstellen Sie Ihre eigene Fassade:

TEST1 Die spezifische Logik:

<?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);
        } 
    }
}

TEST1 Klassenfassade:

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

Verwendung:

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

Erklärung:

facadesTest1Facade Beim Aufruf der statischen Methode hello() wird __callStatic aufgerufen, da diese Methode nicht definiert ist;
  1. in __callStatic , der erste Schritt besteht darin, die entsprechende Instanz abzurufen, d. h. test1
  2. $app in return static::$app->instances[$name];。这其中的 $name,即为 facadesTest1, dem IOC-Container, und der Instanziierungsprozess der Klasse wird von ihm abgewickelt.

Das obige ist der detaillierte Inhalt vonDetaillierte Interpretation der Laravel-Fassade. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen