[Laravel] Facade作成の流れ


今回の題

Facadeの作成方法を復習がてらメモとして書き残します。

バージョン

Laravel6.8

大まかな流れ

  1. クラスの作成
  2. サービスプロバイダーを通し、クラスをサービスコンテナへ登録
  3. Facadeを作成し呼び出す

クラスの作成

クラスを配置するディレクトリの作成

$ mkdir app/Services

app/Services/以下にGreetingService.phpを作成し、クラスと適当なメソッドを定義。

<?php
namespace App\Services;

class GreetingService {

  public function hello() 
  {
    return 'hello';
  }

}

サービスプロバイダーを通し、クラスをサービスコンテナへ登録

自前のサービスプロバイダーを作成

$ php artisan make:provider GreetingServiceProvider

上のコマンドで、app/Providers/以下に作成されたGreetingServiceProvider.phpを以下のように編集。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class GreetingServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
      $this->app->bind('greeting', 'App\Services\GreetingService'); // 追記
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

サービスプロバイダーを登録

config\app.phpを開き、以下のように追記。

    'providers' => [

        // 略

        /*
         * 自作のサービスプロバイダー
         */
        App\Providers\GreetingServiceProvider::class, // 追記
    ],

サービコンテナに登録されたか確認する

サービコンテナの実体は、Illuminate\Foundation\Applicationクラス
Illuminate\Foundation\Applicationクラスは、ヘルパ関数app()で呼び出せるので以下のようにして中身を確認。

dd(app());

色々出てきた中のbindingsを開いて、

さらに色々出てきた中に、先ほど登録したgreetingがあればOK。

Facadeを作成する

Facadeを配置するディレクトリを作成。

$ mkdir app/Facades

app\Facades以下にGreeting.phpを作成し以下のように編集。

<?php
namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class Greeting extends Facade
{

  protected static function getFacadeAccessor()
  {
    return 'greeting'; // サービスコンテナに登録した名前。
  }

}

Facadeのエイリアスを登録

config\app.phpを開き、以下のように追記。

    'aliases' => [

        // 略

        /*
         * 自作のFacade
         */
        'Greeting' => App\Facades\Greeting::class, // 追記

    ],

Facadeを呼び出す

Greeting::hello(); // 結果 hello

コントローラーなどのnamespaceの中から使おうとする場合は
グローバルプレフィックス演算子\をつけてあげるか、
(namespace中からグローバルなクラスなどを使おうとする場合に必要。 参考)

\Greeting::hello(); // 結果 hello

もしくは、

use Greeting;

Greeting::hello(); // 結果 hello

でOK。