LoginSignup
1
2

More than 3 years have passed since last update.

[Laravel] Facade作成の流れ

Last updated at Posted at 2020-09-06

今回の題

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を開いて、
スクリーンショット 2020-09-06 23.26.20.png

さらに色々出てきた中に、先ほど登録したgreetingがあればOK。
スクリーンショット 2020-09-06 23.29.22.png

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。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2