Laravel学習帳

Laravel5.2の学習帳です。開発環境はXAMPP for Windows 5.6.19 / 本番環境はさくらサーバー(スタンダード)

実践知識

ファサードについて

Laravelを深く理解するならLaravelの三大要素を理解しなければいけません。

・サービスコンテナ
・サービスプロバイダー
・ファサード

この3つは互いに関連しており、ファサードは「サービスコンテナ」「サービスプロバイダー」の延長線にあります。

ですので、ファサードを理解する前に少なくとも以下の3つは前提条件として理解しておかなければなりません。

ファサードの理解は時間がかかります。

しかし、Laravelが広く受け入れられた理由の一つにファサードがあるので理解しておくべきです。

今回はこのファサードについてエントリーいたします。

 

ファサードとは

ファサードは クラスメソッド の形式でサービス(クラス)を手軽るに利用できる機能です。

例えば Requestファサードを使う場合

:
public function postIndex()
{
  $name = Request::input('name');
}
:

このように記述しますが、この Request:: がファサードになります。

ちなみにRequestファサードはLaravelで標準で提供されているファサードです。

config\app.php にあるエイリアスの項目を見るとデフォルトで実装されているファサードが確認できます。

'aliases' => [

  'App' => Illuminate\Support\Facades\App::class,
  'Artisan' => Illuminate\Support\Facades\Artisan::class,
  'Auth' => Illuminate\Support\Facades\Auth::class,
:
  'Request' => Illuminate\Support\Facades\Request::class,
:

  ],

ファサード名(キー)とファサードの実体であるクラス(バリュー)がセットされているのがわかります。

これを見ると例えば Requestファサードの実体ファイルは Illuminate\Support\Facades\Request::class であることがわかります。

このクラスはLaravelのプロジェクトでは vendor\laravel\framework\src\Illuminate\Support\Facades\Request.php に置かれています。

このファイルを開くと以下のようにコーディングされています。


class Request extends Facade
{
  /**
  * Get the registered name of the component.
  *
  * @return string
  */
  protected static function getFacadeAccessor()
  {
  return 'request';
  }
}

getFacadeAccessor() メソッドを実装し、ここでサービスコンテナにバインドしてあるキー名(request)を返しています。

このことからファサードとはサービスコンテナで管理されているクラスにアクセスできるクラスであると言えます。

実際にサンプルコードをコーディングしながら理解を深めていきます。

 

チュートリアル

サンプルでクラス(サービス)を作成してファサードを使って呼び出してみます。

手順

1)クラス(サービス)を作成
2)サービスプロバイダーを作成
3)サービスプロバイダーの設定
4)ファサードの作成
5)ファサードのエイリアスを設定
6)ファサードの実行
7)動作確認

 

1)クラス(サービス)を作成

まずサービスとなるクラスを作成します。

Laravelのお作法では "app\Services" にクラスを作成するみたいです。

サンプルのクラスはコールされたら文字を返すだけの簡単なものを作成します。

<?php

namespace App\Services;

class FacadeTest{
  public function getMessage(){
  return "ファサードのテスト成功!";
  }
}

 

2)サービスプロバイダーを作成

作成したクラスをサービスコンテナにバインドします。

クラスをサービスコンテナにバインドする記述はサービスプロバイダーで記述します。

なので、サービスプロバイダーを作成します。

artisanコマンドでサービスプロバイダーのスケルトンを作成するコマンドが用意されています。

php artisan make:provider FacadeTestServiceProvider

コマンドを実行すると app\Providers\ に FacadeTestServiceProvider.php が生成されます。

registerメソッドに以下を記述。

:
    public function register()
  {
    $this->app->bind( //サービスコンテナにバインド
      'facadetest', // キー名
      'App\Services\FacadeTest' // クラス名
    );
  }
【 説明 】
キー名は次のファサードのreturnの返り値で使用します。

 

3)サービスプロバイダーの設定

config\app.php にてサービスプロバイダーを設定します。

  'providers' => [
:
  App\Providers\FacadeTestServiceProvider::class,
  ],

 

4)ファサードの作成

ファサードクラスは app/Facades ディレクトリを作成し、そこに格納します。

<?php
namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class FacadeTest extends Facade{
  protected static function getFacadeAccessor(){
  return 'facadetest';
  }
}
【 説明 】
getFacadeAccessorメソッドの返り値にサービスプロバイダーで設定したキー名を指定します。

 

5)ファサードのエイリアスを設定

サービスプロバイダーの設定を行った config\app にファサードのエイリアスを設定します。

この設定をしておくと、ファサードを利用するごとにuseをしなくても済みます。

  'aliases' => [
:
  'FacadeTest' => App\Facades\FacadeTest::class,
  ],
【 説明 】
配列のキーに "FacadeTest" を指定したことで FacadeTest でクラスにアクセスできるようになります。

 

6)ファサードの実行

Route::get('demo/facade',function(){
  return FacadeTest::getMessage();
});
【 説明 】
クラスのメソッドを静的メソッドのように記述できます。

 

7)動作確認

http://{ホスト}/demo/facade にアクセス。

上記のように表示されればOKです。

ファサードについては以上です。

 

-実践知識