ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

【CakePHP3.x】TableクラスでEnumを使う

スポンサードリンク

DBでステータスのフィールドを用意した場合、0とか1とかでフラグを用意するんだけど、それじゃいまいちよくわからない。

なので、定数にして、DELETEとかCANCELとか名前を付けれるようにする。

CakePHP2.xでは、~/Config/const.phpってファイルを作成して、そこで管理していました。

しかし、定数が多くなると管理が面倒くさい。

CakePHP3.xのModelにはTableってクラスがある。そこで管理すればいいんじゃね!? とひらめく(?)

ぐぐったら、下記リンクが参考になった。

qiita.com

あんまりしっくりこなかった。というのも。

<?php
// ... 省略
define('DELETE', 0);
define('CANCEL', 1);

Configure::write('FLAG', array(
    DELETE => '削除',
    CANCEL => 'キャンセル'
));

CakePHP2.xでは、定数にラベルを用意していたのだ。カスタムしないといけないなと思う。

では、プラグインはないだろうか? ありました。

github.com

しかし、これはTableレベルでのEnumなのだ。できればクラスに書けるプロパティベースのがいい。

あった! ありがとうございます m(_ _ )m

k1low.hatenablog.com

さっきのプラグインを使った上でのプラグインである。

まず、CakeDC/Enumをインストールして、ロードするように設定する。

$ composer require cakedc/enum:~1.0
$ bin/cake plugin load CakeDC/Enum

次に、作っていただいたプラグインをインストール

$ composer require k1low/property-enum

あとは必要なTableクラスと~/Controller/AppController.phpに追記するのみ

  • ~/src/Model/Table/AdminUsersTable.php
<?php
// ... 省略
class AdminUsersTable extends Table
{

    public $enums = [
        'status' => [
            'unapproved' => 'unapproved' // 未承認
        ]
    ];

    public function initialize(array $config)
    {
        parent::initialize($config);
        // ... 省略
        $this->addBehavior('PropertyEnum.Enum', ['lists' => [
            'status' => [
                'strategy' => 'property'
            ]
        ]]);
// ... 省略
  • ~/src/Controller/AppController.php
<?php
// ... 省略
    public function initialize()
    {
        // ... 省略
        $this->loadComponent('PropertyEnum.AutoSet');
     }
// ... 省略

これでできた!

と、思われた。。。

ラベルをつけるの忘れていた。。。あと多言語化が必要なので、翻訳も取り入れたい。どうしたものか。。。

綺麗じゃないと思うんだけど、初期化の処理にプロパティに追加する方法を選んだ。

<?php
// ... 省略
class AdminUsersTable extends Table
{

    public $enums = [];

    /**
     * Initialize method
     *
     * @param array $config The configuration for the Table.
     * @return void
     */
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->enums = [
            'status' => [
                __('unapproved'),
                __('approved'),
                __('cancel')
            ]
        ];
        // ... 省略
        $this->addBehavior('PropertyEnum.Enum', ['lists' => [
            'status' => [
                'strategy' => 'property'
            ]
        ]]);
    }
// ... 省略

これでよし(一応)