CakePHP3でもActiveRecord::Enumを使いたいので、CakeDC/EnumベースでPropertyEnumを作った

k1low.hatenablog.com

CakePHP2では GitHub - k1LoW/Enumm: Enumm: Enum(model) plugin for CakePHP を作って使っていたのですが、CakePHP3では動きません。

CakePHP3で使える同じようなPluginを探して、CakeDC/Enum を見つけたのですが、CONSTベースとConfigureベース、データベースのテーブルベースしかありませんでした。

というわけで、Enummと同じようにプロパティベースで動くようにCakeDC/Enumにストラテジを追加する形でPropertyEnumを作りました。

github.com

使い方

Tableに $enums プロパティを設定して、 ['strategy' => 'property'] することでCakeDC/Enumの他のストラテジと同じように利用可能です。

<?php

class ArticlesTable extends Table
{
    public $enums = [
        'status' => [
            'public' = 'Published';
            'draft' = 'Drafted';
            'archive' = 'Archived';
        ],
    ];

    public function initialize(array $config)
    {
        $this->addBehavior('PropertyEnum.Enum', ['lists' => [
            'status' => [
                'strategy' => 'property',
            ]
        ]]);
    }
}

AutoSetComponent

Enummの時と同様に $enums をViewに自動でsetしたいときは PropertyEnum\AutoSetComponent を読み込むことで可能です。

<?php
namespace App\Controller;

class AppController extends Controller
{
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('PropertyEnum.AutoSet');
    }
}

というわけで

CakePHP3でも気楽にEmunを使えるようになりました。