はじめに
ValueObjectを導入する方法を探す必要なんてなくて、app/ValueObjectsディレクトリ作ればおしまいではあるのですが、Laravelらしくphp artisan make:value-objectコマンドでファイルを自動生成するところまでをパッケージにして公開しました。
ソースコードはこちら です。
composer require imunew/laravel-value-objects で導入できます。
こんなValueObjectがいい
ValueObjectに求めるものは、以下のとおりです。
-
immutable- 必要なデータは
__constructでのみセットして -
setterはpublicにしない -
@property-readなプロパティにアクセス可能
- 必要なデータは
-
Eloquent Modelみたいに-
getterをいちいち書かなくていい -
Accessor(get{Attribute}Attribute)を実装できる -
artisan make:value-objectコマンドでファイル作れる
-
一応、packagistでパッケージを探してみましたが、条件を満たすものはありませんでした。
chalcedonyt/laravel-valueobject は、immutableだし、makeコマンドも用意されていて、いい感じなのですが、残念ながら、2015-11-13を最後に更新が止まっていて、Laravel 6.x以降には対応していませんでした。
こんな感じで使えます
例1) Rangeクラス
namespace App\ValueObjects;
use Imunew\Laravel\ValueObjects\ImmutableObject;
class Range extends ImmutableObject
{
/**
* Range constructor.
* @param int $start
* @param int $end
* @param int $step
*/
public function __construct(int $start, int $end, int $step = 1)
{
$this->setAttribute('start', $start);
$this->setAttribute('end', $end);
$this->setAttribute('step', $step);
}
/**
* @return array
*/
public function getRangeAttribute()
{
return range($this->start, $this->end, $this->step);
}
}
$range = new Range(1, 10);
echo $range;
// [1,2,3,4,5,6,7,8,9,10]
例2) DirectoryTreeクラス
namespace App\ValueObjects;
use Imunew\Laravel\ValueObjects\ImmutableObject;
class DirectoryTree extends ImmutableObject
{
/**
* Range constructor.
* @param array $directoryTree
*/
public function __construct(array $directoryTree)
{
$this->attributes = $directoryTree;
}
}
$directoryTree = new DirectoryTree([
'app' => [
'Http' => [
'Controllers' => [],
'Middleware' => [],
'Requests' => [],
'Resources' => [],
],
'ValueObjects' => []
]
]);
echo json_encode($directoryTree->get('app.Http'));
// {"Controllers":[],"Middleware":[],"Requests":[],"Resources":[]}
おわりに
我ながらいい感じのLaravelパッケージができました。
ぜひ使ってみてください。
ではでは。