ファザード

記事の内容

概要

サービスコンテナに登録されたクラスやインスタンスに対して、静的メソッドとしてアクセスするための仕組み

【例】

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' を返す。

getFacadeAccessor
ファサードがどのサービスコンテナのバインディングを参照するかを決定するためのメソッド

【ファイル先】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'に関連するクラスを取得します。

register : サービスコンテナへのバインディング

※以下の場合は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);
    }
===========================
省略
===========================
}
記事の内容
閉じる