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では、引数の名前でサービスコンテナからインスタンスを取得しています。
簡単にすると、ファザード はエイリアスが設定されていて、使用するときはキー名をクラスのように使用する。
しかしその実態は、サービスコンテナで解決をし、インスタンスを返している。
以上!!!!!!!