見出し画像

Laravel 学習記録 #020 ファサードを学ぶ

Laravelのファサードについて学習したものをまとめてます。

ファサードとは

  • クラス名::メソッド()のように静的に利用できるようにする機能

  • サービスコンテナがなんやかんやいい感じにしてくれている

  • 標準でファサードは用意されている(Auth、Config、DBなど)

  • 独自のファサードも追加可能

  • ファサード作成手順はクラスを作成→サービスコンテナに登録→エイリアス登録

  • 使う際にコードが簡潔にはなるが、定義元で肥大化しやすいので注意が必要


独自ファサードを試す

静的にアクセスしたいケースは多々出てくると思いますので試してみます。

クラスを作る

ファサードの処理となるクラスをサービスクラスに作ってみます。
文字列を返すだけのhelloメソッドをstaticで作成します。

<?php

namespace App\Services;

class MyFacadeService
{
    public static function hello()
    {
        return 'hello my facade';
    }
}

次に、app配下にFacadesディレクトリを作成し
Illuminate\Support\Facades\Facadeクラスを継承したファサードクラスを作ります。
getFacadeAccessorを定義し、サービスコンテナに登録する名前を返します。

<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;

class MyFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'MyFacade';
    }

}

サービスコンテナに登録

サービスプロバイダを新規で作成し、サービスコンテナに登録します。
MyFacadeServiceProviderを作成します。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\MyFacadeService;

class MyFacadeServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind('MyFacade', function () {
            return new MyFacadeService();
        });
    }
}

そしてこのサービスプロバイダーを登録します。
config/app.phpのprovidersに追加します。

'providers' => ServiceProvider::defaultProviders()->merge([
        /*
         * Package Service Providers...
         */

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
        App\Providers\MyFacadeServiceProvider::class, //追加
    ])->toArray(),

エイリアスを登録

config/app.phpのaliasesに登録します
キーに設定した名前で呼べるようになります。

'aliases' => Facade::defaultAliases()->merge([
        'MyFacade' => App\Facades\MyFacade::class,
    ])->toArray(),


呼び出す

コントローラーで使ってみます。
作成したファサードをuseして、MyFacade::hello()とすることで呼べます。

use App\Facades\MyFacade;



class SampleController extends Controller
{

 

    public function index()
    {
        dd(MyFacade::hello());
    }


こんな感じで使えるとのこと。
静的メソッドを用意するだけであればサービスプロバイダ
を作成せず、エイリアス設定でも良さそうな気がします。

サービスコンテナ、サービスプロバイダあたりをもう少し詰めた後に再度確認していきたい。。。

この記事が気に入ったらサポートをしてみませんか?