Laravel ファザード 調べてみた

ファザードとは

クラスメソッドの形でフレームワークに登録されている機能を利用できるもの。もちろん独自に作成することもできる。

 

登録方法

config/app.phpのaliasプロパティにエイリアスとして保存している。

例:

'aliases' => [ 'App' => Illuminate\Support\Facades\App::class,
 'Arr' => Illuminate\Support\Arr::class,
 'Artisan' => Illuminate\Support\Facades\Artisan::class,
 'Auth' => Illuminate\Support\Facades\Auth::class,
 'Blade' => Illuminate\Support\Facades\Blade::class,
 'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
 'Bus' => Illuminate\Support\Facades\Bus::class,
 'Cache' => Illuminate\Support\Facades\Cache::class,
 'Config' => Illuminate\Support\Facades\Config::class,
・・・

 

使用方法

エイリアスとして登録したキーをクラスのように使用する。

例:

\Config::get('app.debug');

 

実態

エイリアスとして使用しているので、実際には登録した値が呼び出されている。

上記の例では、Illuminate\Support\Facades\Config::classが呼び出されている。

Illuminate\Support\Facades\Config.php

<?phpnamespace Illuminate\Support\Facades;

/**
 * @method static array all()
 * @method static bool has($key)
 * @method static mixed get($key, $default = null)
 * @method static void prepend($key, $value)
 * @method static void push($key, $value)
 * @method static void set($key, $value = null)
 *
 * @see \Illuminate\Config\Repository
 */
class Config extends Facade
{
 /**
 * Get the registered name of the component.
 *
 * @return string
 */
 protected static function getFacadeAccessor()
 {
 return 'config';
 }
}

しかし、Illuminate\Support\Facades\Config::classではgetメソッドが実装されていない。

その場合(呼び出されたメソッドが実装されていない場合)、親クラスであるIlluminate\Support\Facades\Facade::classの__callStaticメソッドが呼び出されている。

Illuminate\Support\Facades\Facade.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);
}

__callStaticメソッドは、引数に呼び出されたメソッドとargumentsを引数に取り、static::getFacadeRoot()で所得したインスタンスに渡されたメソッドを実行している

public static function getFacadeRoot(){
 return static::resolveFacadeInstance(static::getFacadeAccessor());
}

protected static function getFacadeAccessor()
{
 throw new RuntimeException('Facade does not implement getFacadeAccessor method.');
}

protected static function resolveFacadeInstance($name)
{
 if (is_object($name)) {
 return $name;
 }

 if (isset(static::$resolvedInstance[$name])) {
 return static::$resolvedInstance[$name];
 }

 if (static::$app) {
 return static::$resolvedInstance[$name] = static::$app[$name];
 }
}

getFacadeRootでは、resolveFacadeInstanceで取得したインスタンスを返す。
getFacadeAccessorは、Illuminate\Support\Facades\Config.phpでオーバーライドされているので、今回のケースではconfigを返す。

resolveFacadeInstanceでは、引数の名前でサービスコンテナからインスタンスを取得しています。

 

簡単にすると、ファザード はエイリアスが設定されていて、使用するときはキー名をクラスのように使用する。

しかしその実態は、サービスコンテナで解決をし、インスタンスを返している。

 

以上!!!!!!!