はじめに
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
パッケージができました。
ぜひ使ってみてください。
ではでは。