【Laravel】Presenterクラスを利用してデコレーターパターンを実装する
やりたいこと
LaravelでPresenterクラスを利用してデコレータパターンを実装したい
デコレータパターンとはデザインパターンの1つであり、クラスに対して機能を簡単にカスタマイズできる実装方法になります。詳しくは以下をご参照ください。
今回の実装に関してもう少し具体的にイメージを説明すると、PresenterクラスによってModelクラスの値をViewで使う値に変換するイメージになります。
つまり、ModelクラスとViewに1枚Presenterクラスという実装を挟むことで値を両者が使いやすいように変換しようという考え方です。
手順
- ライブラリのインストール・読み込み
- Presenterクラスの実装
- Modelクラスへの適応
- 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() }}
// 男
以上!!!!!!!