CakePHP3にステートマシンなEnumの仕組みを組み込むStatefulEnumを作った

k1low.hatenablog.com

と、CakePHP3にEnumの仕組みを組み込んだのですが、

さらに、ActiveRecord::Enumにステートマシンの仕組みを組み込むgemが

github.com

「これは便利そう!!!全ての機能をポートするのは難しそうだけど、Enumで管理されているフィールドにステートマシンの制約を組み込むくらいはできるかも。」

ということで作ってみました。

github.com

使い方

基本的には https://github.com/k1LoW/property-enum と合わせて使ってもらうことを想定していますが、特に制限はありません。

<?php
class BugsTable extends Table
{
    const STATUS_UNASSIGNED = 'unassigned';
    const STATUS_ASSIGNED = 'assigned';
    const STATUS_RESOLVED = 'resolved';
    const STATUS_CLOSED = 'closed';

    public $transitions = [
        'status' => [
            'assign' => [
                'from' => self::STATUS_UNASSIGNED,
                'to' => self::STATUS_ASSIGNED
            ],
            'resolve' => [
                [self::STATUS_ASSIGNED, self::STATUS_UNASSIGNED], // from
                self::STATUS_RESOLVED // to
            ],
            'close' => [
                [self::STATUS_ASSIGNED, self::STATUS_UNASSIGNED, self::STATUS_RESOLVED],
                self::STATUS_CLOSED
            ],
        ]
    ];

    public function initialize(array $config)
    {
        $this->primaryKey('id');
        $this->addBehavior('StatefulEnum.StatefulEnum');
    }
}

上記のように $transitions を設定することでフィールドのBugsTable.statusのステートマシンの仕組みを組み込みます。 amatsuda/stateful_enumtransition の制約だけを実現した形になります(メソッドまではない)。

これだけでもシンプルにステートマシンを定義できるので便利かと。

というわけで

機能追加のプルリクなどお待ちしております。