記事の内容
概要
サービスコンテナに登録されたクラスやインスタンスに対して、静的メソッドとしてアクセスするための仕組み
【例】
use Illuminate\Support\Facades\Log;
public function login(Request $request)
{
$user = User::where('email', $request->email)->first();
if ($user && Hash::check($request->password, $user->password)) {
Log::info('User logged in', ['user_id' => $user->id, 'email' => $user->email]);
// ログイン処理
} else {
// 認証失敗
}
}
ファサードの動作の流れ
サービスコンテナの利用
getFacadeAccessor
メソッドが 'log'
を返す。
【ファイル先】vendor/laravel/framework/src/Illuminate/Support/Facades/Log.php
<?php
namespace Illuminate\Support\Facades;
class Log extends Facade
{
protected static function getFacadeAccessor()
{
return 'log';
}
}
バインディングの登録
サービスコンテナに登録されている'log'
に関連するクラスを取得します。
※以下の場合はLogManager
【ファイル先】vendor/laravel/framework/src/Illuminate/Log/LogServiceProvider.php
<?php
namespace Illuminate\Log;
use Illuminate\Support\ServiceProvider;
class LogServiceProvider extends ServiceProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->singleton('log', fn ($app) => new LogManager($app));
}
}
メソッド
LogManager
クラスの info
メソッドを呼び出します。
【ファイル先】vendor/laravel/framework/src/Illuminate/Log/LogManager.php
class LogManager implements LoggerInterface
{
===========================
省略
===========================
/**
* 重要なイベントをログに記録します。
*
* @param string|\Stringable $message ログに記録するメッセージ
* @param array $context コンテキスト情報(オプション)
* @return void
*/
public function info($message, array $context = []): void
{
$this->driver()->info($message, $context);
}
===========================
省略
===========================
/**
* デフォルトのドライバインスタンスに対して動的にメソッドを呼び出します。
*
* @param string $method 呼び出すメソッド名
* @param array $parameters メソッドに渡すパラメータ
* @return mixed
*/
public function __call($method, $parameters)
{
return $this->driver()->$method(...$parameters);
}
===========================
省略
===========================
}