もしかしたら、プルダウンが多い新規プロジェクトにjoinすることになりそうだったので、ソースコード上のプルダウンデータの配置を検討していたのですが、ActiveRecord::EnumをRailsな人たちに教えてもらったので、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」があることで、ゆるい規約になればいいかな、と。
というわけで
新規プロジェクトの最初の設計に思いを馳せたりするのですが、ここが一番おもしろいですね。