【Laravel】Presenterクラスを利用してデコレーターパターンを実装する

やりたいこと

LaravelでPresenterクラスを利用してデコレータパターンを実装したい

デコレータパターンとはデザインパターンの1つであり、クラスに対して機能を簡単にカスタマイズできる実装方法になります。詳しくは以下をご参照ください。

今回の実装に関してもう少し具体的にイメージを説明すると、PresenterクラスによってModelクラスの値をViewで使う値に変換するイメージになります。

つまり、ModelクラスとViewに1枚Presenterクラスという実装を挟むことで値を両者が使いやすいように変換しようという考え方です。

 

手順

  1. ライブラリのインストール・読み込み
  2. Presenterクラスの実装
  3. Modelクラスへの適応
  4. Viewで使用

 

実装

1 ライブラリのインストール・読み込み

今回は、robclancy/presenterというライブラリを使用します。

以下コマンドでライブラリをインストールします。

composer require robclancy/presenter

app.jsにインストールしたライブラリを読み込みます。

config/app.js

.
.
.
  'providers' => [
.
.
.
     Robbo\Presenter\PresenterServiceProvider::class,
.
.
.

以上でライブラリのインストールと読み込みは完了です。

 

2  Presenterクラスの実装

Presenterクラスを実装します。

プロジェクトディレクトリのどこかにPresenterクラスを実装するファイルを作成します。

ディレクトリ構造は依存しないのでどこでも良いのですが、今回はappディレクトリ以下にPresentersディレクトリを作成し、それ以下に各Presenterファイルを作成していきます、

app/Presenters/GenderPresenter.php

<?php

 namespace App\Presenters;

 use Robbo\Presenter\Presenter;

 class GenderPresenter extends Presenter . . . ①
 {
   public function genderTypeToString(): string . . . ②
    {
     $gender_text= '';
     switch ($this->object->gender_type) { . . . ③
      case 0:
       $gender_text = '男';
       break;
      case 1:
       $gender_text = '女';
       break;
      case 2:
       $gender_text= 'その他';
       break;
     }
     return $gender_text;
 }
}

Presenterを継承したクラスを作成します。

クラス内でメソッドを作成します。

このメソッドがModelからViewの間に入る処理になります。

$this->object->名前で、Modelから渡ってきた値を参照できます。

 

3  Modelクラスへの適応

Modelクラスに作成したPresenterを適応させます。

以下はUserモデルに適応させた例になります。

<?php

namespace App\DataProvider\Eloquent;

use Illuminate\Database\Eloquent\Model;
use App\Presenters\GenderPresenter;
use Robbo\Presenter\PresentableInterface;

class User extends Model implements PresentableInterface . . . ①
 {
  public function getPresenter() . . . ②
  {
   return new GenderPresenter($this);
  }
 }

①Presentableインターフェースをimplementします。

②getPresenterメソッドを実装し、その中で作成したPresenterクラスを適応させます。

(gerPresenterメソッドは他のメソッド名では適応されないのでご注意ください)

 

4 Viewで使用

以上の設定でViewで使用することができます。

以下は使用例になります。

// $userはUserモデルのデータ
{{ $user->genderTypeToString() }} 
// 男

 

以上!!!!!!!