CakePHPでActiveRecord::Enumを使いたいので "Enumm" pluginを作った

もしかしたら、プルダウンが多い新規プロジェクトにjoinすることになりそうだったので、ソースコード上のプルダウンデータの配置を検討していたのですが、ActiveRecord::EnumRailsな人たちに教えてもらったので、CakePHPでも($enumsの配置だけ)なんとなく使えるようにしました。

https://github.com/k1LoW/Enumm

今までのプルダウンデータ配置

自分は Configure::write() 一択でした。bootstrap.phpにつらつらと書き連ねる感じですね。

<?php // bootstrap.php
    Configure::write('Post.categories', [
           'diary' => 'My Diary',
           'news' => 'News Topic',
    ]);
<?php // PostsController.php
    public function beforeFilter() {
        $this->set('categories', Configure::read('Post.categories'));
    }

バリデーションで使いたいときはYavの AdditionalValidationRulesBehavior::inListFromConfigure() とのコンボで対処。

これはこれでうまく言っているのですが、プルダウンデータは「MVCでいうとMだよなー」と悶々としていました。

Enummを利用したプルダウンデータ配置

ActiveRecord::Enumいいね!Modelに関係のあるプルダウンデータならModelに書きたい!」ということで、

<?php // Post.php
    class Post extends AppModel {

        public $actsAs = ['Enumm.Enumm'];

        public $enums = [
             'category' => [
                'diary' => 'My Diary',
                'news' => 'News Topic',
             ]
        ];
    }
<?php // PostsController.php
   class PostsController extends AppController  {
       public $components = ['Enumm.Enumm'];
   }

こんな感じで Post.category フィールドに対してenumsを設定します。

すると、Controllerで EnummComponentを呼んでいると、勝手に $enums をViewにsetします。

また、Post.category フィールドに対してInListなバリデーションが自動で設定されます。

(詳しくはテストケースで)

現在はパラメータ配置系だけの、あってもなくてもいいようなシンプル実装ですが、必要になればマジックメソッド周りも整備したりしようかと思っています。

こういう「ほんのちょっとだけ便利になるPlugin」があることで、ゆるい規約になればいいかな、と。

というわけで

新規プロジェクトの最初の設計に思いを馳せたりするのですが、ここが一番おもしろいですね。