6
4

More than 3 years have passed since last update.

Laravel で ValueObject を最も簡単に導入する方法

Last updated at Posted at 2020-12-26

はじめに

ValueObjectを導入する方法を探す必要なんてなくて、app/ValueObjectsディレクトリ作ればおしまいではあるのですが、Laravelらしくphp artisan make:value-objectコマンドでファイルを自動生成するところまでをパッケージにして公開しました。

ソースコードはこちら です。
composer require imunew/laravel-value-objects で導入できます。

こんなValueObjectがいい

ValueObjectに求めるものは、以下のとおりです。

  • immutable
    • 必要なデータは__constructでのみセットして
    • setterpublicにしない
    • @property-readなプロパティにアクセス可能
  • Eloquent Modelみたいに
    • getterをいちいち書かなくていい
    • Accessorget{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パッケージができました。
ぜひ使ってみてください。
ではでは。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4