CakePHP3のBakeを使う上でのTips


CakePHPには元来、Bakeという便利な機能がある。一言でいうと、基本的なコードは0から書かなくても自動生成してくれる。
例えば、Modelや、View、Controllerの最低限の機能は、コマンド1行で勝手に出来上がる仕組みだ。


例えばお問合せフォームを作ろうと考えたとする。
パターンはまず3通りある。


  1.完全に素のPHPでスクラッチ開発
  2.CakePHPを入れて、セキュリティなどの部分だけを利用し、スクラッチ開発
  3.CakePHPでBakeコマンド


1だと、開発期間は1週間見積もるべきだろう。開発が2日で終わっても、二日間検証してみて、出てきたバグのfixにさらに2日費やす可能性がある。
以下のような対応も自力で実装する必要がある。


  ・プルダウンやチェックボックスvalue値を送信前に改ざんされた場合のエラー
  ・「入力」→「確認」→「送信」の画面遷移でのセッション管理
  ・完全に同時アクセスされた場合の、ログファイルなどの排他制御
  ・メール通知があればヘッダインジェクション、DBであればSQLインジェクション、ファイル書き出しであればその排他制御
  ・入力項目に応じた値のバリデーション


2の場合、上記の5つはCakePHPの機能を利用できる。工期は半分ぐらいになるかもしれない。
3であれば、DBのカラムに応じて、MVCを勝手に作ってくれる上に、一覧、詳細、追加、削除の4画面を勝手に用意してくれる。
さらにそのために必要な所要時間は、1分もいらないのだ。


3のパターンで作業するとすると、要件にフィットしない細部を微調整する作業がすべてだ。
例えばDB上にカラムは用意するもののフォームからの入力ではない情報を入れたいとなると、自動生成されたソースに手をいれる必要がある。
仮に申請系のシステムのフォームだと仮定する。その申請のステータスをフォームから手入力させる必要はないだろう。システムが状態を判定してDBのカラムを勝手に更新すればいい。
が、BakeだとDBにカラムがあると勝手に入力フォームになってしまうので、それをviewから削除したりする必要がある。
ついでにその値が必須項目かどうかも自動で判定しているので、viewを消しただけだと未入力エラーになる可能性もある(そうであればModel/Tableの中にあるモデルのソースを見て調整する)。
テキストフィールドではなくラジオボタンで、値はテキストではなくフラグで持ちたいような場合にはなかなかだるい作業がある。値に応じてラベルを切り替えるようにviewを書き換えていく。
その上で、例えばラジオボタンで”その他”が選択された場合のみ、その下の「その他」のテキストフィールドに入力必須エラーの判定を行う、みたいなありがちな対応などを調整すればいい。


パターン3で対応できるならパターン3を選ぶべきだと思う。
重要なことは毎回ゼロから作り直さないほうがいいということだ。なぜなら、既存のコードなり自動生成されたコードは、
既にテストケースを通ったコードだということだ。無から作り直す場合、すべてをテストしなければならないということである(もちろん既存のコードは二度とテストしなくていいという意味ではない)。
もちろん、枯れたはずのソースにもバグが残っているだろうが、それよりも車輪の再開発によって新しいバグが作りこまれる可能性のほうがしょうもないし時間が無駄となる。