Laravel Facade実現暴露


Facade(ドア)は、アプリケーション・サービス・コンテナ内のバインド・クラスに「静的」インタフェースを提供し、従来の静的メソッドよりも、メンテナンス時にテストが容易で、柔軟で、簡明で優雅な構文を提供します.
Laravelには多くのfacadeが内蔵されており、IlluminateSupportFacadesネーミングスペースの下に定義されています.App、Artisan、Auth、Cache、Config、Cookie、DB、Event、File、Log、Mail、Queue、Redis、Redirect、Request、Response、Route、Validator、URLなどです.
ゲートクラスは1つのメソッドgetFacadeAccessorを実装するだけです.このメソッドは、コンテナから何を解析するかを定義し、Facadeベースクラスがマジックメソッドを使用します.callStatic()は、解析オブジェクトをゲートから呼び出します.たとえばcacheクラスです.
/**
 * @see \Illuminate\Cache\CacheManager
 * @see \Illuminate\Cache\Repository
 */
class Cache extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'cache';
    }
}

上記コードの説明では、コンテナからcacheオブジェクトが解析するが、cacheオブジェクトが何であるかは、ServiceProviderがcacheに登録するものがconfig/appであるかによって決まる.phpに登録されているcacheサービスプロバイダが表示されます.
'providers' => [
    //...
    Illuminate\Cache\CacheServiceProvider::class,
    //...
],

CacheServiceProviderクラスでは、CacheManagerを使用して、どのタイプのcacheを使用しているかを管理しています.
class CacheServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('cache', function ($app) {
            return new CacheManager($app);
        });
        //....
    }
}

CacheManager関数コードを参照
public function getDefaultDriver()
{
    return $this->app['config']['cache.default'];
}

/**
 * Set the default cache driver name.
 *
 * @param  string  $name
 * @return void
*/
public function setDefaultDriver($name)
{
    $this->app['config']['cache.default'] = $name;
}

プロファイルを参照してください.phpは、最終的にenvで構成されるドライバタイプを使用するか、デフォルトはfileであり、その他にredis、memcache、databaseなど、最終facaceで得られるenv構成のクラスがある.
'default' => env('CACHE_DRIVER', 'file'),

ではCacheクラスを解析した後、Cache::get()メソッドは呼び出されますね.Cache自体はgetメソッドがないので、Cacheの抽象ベースクラスFacadeからお話しします.このクラスでは__が実装されています.callStaticメソッド、すなわち呼び出しが存在しないか呼び出せない静的メソッドを呼び出すと実行されます.したがってCache::get()のgetメソッドは最終的にこのメソッドに進み,最後の行のreturnによって実現される.
public static function getFacadeRoot()
{
    return static::resolveFacadeInstance(static::getFacadeAccessor());
}

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); /*...      ,                */
}