ホームページ  >  記事  >  PHPフレームワーク  >  Laravel Facadeの詳細な解釈

Laravel Facadeの詳細な解釈

藏色散人
藏色散人転載
2020-11-09 15:26:032241ブラウズ

以下は、Laravel チュートリアル コラムからの Laravel Facade の詳細な説明です。 . 困っている方のお役に立てれば幸いです!

Laravel Facadeの詳細な解釈

皆さんこんにちは。今日の内容はLaravelのFacade機構の実装原理についてです。

ファサードの簡単な使用方法

データベースの使用:

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

IOC コンテナ

ご存知のとおり、IOC コンテナは、 Laravel フレームワーク。 IOC とコンテナという 2 つの機能を提供します。

  • IOC (Inversion of Control)、制御の反転とも呼ばれます。端的に言えば、開発者がオブジェクトの生成方法については気にする必要がなく、オブジェクトの使用方法だけを気にする必要がないように、オブジェクトの生成を制御することです。
  • IOC メカニズムを通じて生成されたオブジェクト インスタンスには、継続的に使用するための保存場所が必要です。これがコンテナ機能です。

今回は IOC コンテナの具体的な実装については説明しません。後で詳しく説明した記事があります。 IOC コンテナに関して、読者は 2 つの点だけを覚えておく必要があります:

  1. 設定に従ってオブジェクト インスタンスを生成する;
  2. いつでも簡単にアクセスできるようにオブジェクト インスタンスを保存する;

簡略化されたファサード クラス

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

コードの説明:

  1. $app は、setFacadeApplication( ) を介して渡される IOC コンテナ インスタンスを格納します。この静的メソッドによって設定されるメソッドは、__callStatic マジック メソッドを実装します。
  2. getFacadeAccessor() メソッドはサブクラスが継承することを要求し、文字列識別子を返します。この識別子を通じて、IOC コンテナはバインドされているクラスのオブジェクトを返すことができます (フレームワークの初期化またはバインディング (その他の場合)
  3. $instance を通じて特定のメソッドを呼び出す
  4. 独自のファサードを作成する:

TEST1 特定のロジック:

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

TEST1 クラスのファサード:

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

使用法:

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

説明:

facades\Test1Facade は静的メソッド hello () を呼び出します。このメソッドは次のとおりです。定義されていない場合、__callStatic が呼び出されます;
  1. __callStatic では、対応するインスタンス、つまり
  2. return static::$app->instances[$name ];
  3. が最初に取得されます。 $name は、IOC コンテナである facades\Test1 の test1$app であり、クラスのインスタンス化プロセスはそれに渡されます。ハンドル。

以上がLaravel Facadeの詳細な解釈の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。