DBでステータスのフィールドを用意した場合、0とか1とかでフラグを用意するんだけど、それじゃいまいちよくわからない。
なので、定数にして、DELETE
とかCANCEL
とか名前を付けれるようにする。
CakePHP2.xでは、~/Config/const.php
ってファイルを作成して、そこで管理していました。
しかし、定数が多くなると管理が面倒くさい。
CakePHP3.xのModelにはTableってクラスがある。そこで管理すればいいんじゃね!? とひらめく(?)
ぐぐったら、下記リンクが参考になった。
あんまりしっくりこなかった。というのも。
<?php // ... 省略 define('DELETE', 0); define('CANCEL', 1); Configure::write('FLAG', array( DELETE => '削除', CANCEL => 'キャンセル' ));
CakePHP2.xでは、定数にラベルを用意していたのだ。カスタムしないといけないなと思う。
では、プラグインはないだろうか? ありました。
しかし、これはTableレベルでのEnumなのだ。できればクラスに書けるプロパティベースのがいい。
あった! ありがとうございます m(_ _ )m
まず、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' ] ]]); } // ... 省略
これでよし(一応)