今回は、前回の記事「【覚えておくと便利】CakePHP3.8で使える書き方サンプル」の続きで、プログラミングに関する記事になります。
自分は普段CakePHPを使った開発をすることが多いので、ある程度汎用的に使える部品を作っておいて、Webサイト・システムに合わせて部品を組み合わせて使っていたりします。
本記事では前回に引き続き、自分がCakePHPでよく使う書き方のサンプルやちょっとした部品について紹介できればと思います。
CakePHPは社内で使う要件の込み入ったプロジェクト管理システムから月間1,000万PVに耐えられるようなCMSなど、かなりの柔軟に対応できるフレームワークですので、CakePHPを使ってWebシステム開発をされる方の参考になれば幸いです。
目次
TableでValidationを書くときの簡素化
Cakephpの公式ドキュメントにも記載があるように、Entity向けにTableクラスでValidationを実装するときに下記のような書き方が一般的かと思います。([10, 20, 30, 40]などはサンプルで指定しているだけなので、Collectionから配列を取り出しになると思いますが)
| public function validationDefault(Validator $validator){
 $validator
 ->integer('id')
 ->allowEmptyString('id', __('validation.required'), 'create');
 $validator
 ->integer('type')
 ->notEmptyString('type', __('validation.required'))
 ->inList('type', array_keys([10, 20, 30, 40]), __('validation.inList'));
 $validator
 ->scalar('value')
 ->notEmptyString('value', __('validation.required'))
 ->maxLength('value', 512, __('validation.maxLength.{0}', 512));
 $validator
 ->scalar('ext')
 ->allowEmptyString('ext')
 ->maxLength('ext', 1024, __('validation.maxLength.{0}', 1024));
 return $validator;
 }
 
 | 
こちらは皆さん既にされているかもしれませんが、下記のような書き方にするとEntityのプロパティ名を指定するのが1回で済むので、格段に使い回しやすくなります。
| public function validationDefault(Validator $validator){
 $column = 'id';
 $validator
 ->integer($column)
 ->allowEmptyString($column, __('validation.required'), 'create')
 ;
 $column = 'type';
 $validator
 ->integer($column)
 ->notEmptyString($column, __('validation.required'))
 ->inList($column, array_keys([10, 20, 30, 40]), __('validation.inList'))
 ;
 $column = 'value';
 $validator
 ->scalar($column)
 ->notEmptyString($column, __('validation.required'))
 ->maxLength($column, 512, __('validation.maxLength.{0}', 512))
 ;
 $column = 'ext';
 $validator
 ->scalar($column)
 ->allowEmptyString($column)
 ->maxLength($column, 1024, __('validation.maxLength.{0}', 1024))
 ;
 return $validator;
 }
 
 | 
また、512や1024などもMAX_LENGTH_MIDDLEやMAX_LENGTH_LONGなどで定数にしておくとシステムで標準化できて、標準の文字列の長さが変わったときも対応しやすいですね。
form要素を作る時の簡素化
CakePHPのフォームを作る時の呼び出し方は一般的に以下のような書き方が紹介されていると思います。(classやlabelはbootstrapをベースにしたサンプルになっていますのでお気になさらず)
| <label for="type">種別
 </label>
 <?= $this->Form->select('type', $types, [
 'value' => $entity->type,
 'id' => 'type',
 'label' => 'type',
 'class' => 'form-control custom-select',
 ]); ?>
 
 | 
これもValidationのときと同じように、以下のように書くことで再利用しやすくなります。
| <?php $varName = 'type'; ?><label for="<?= h($varName) ?>">
 <?= __($varName) ?>
 </label>
 <?= $this->Form->select($varName, $types, [
 'value' => $entity->$varName,
 'id' => $varName,
 'label' => $varName,
 'class' => 'form-control custom-select',
 ]); ?>
 
 | 
考え方としては$varNameでEntityのプロパティを決めて、あとはHTMLのidやlabelに使い回しをしていくイメージですね。
先のi18n対応をしておくことで、テキストボックスやセレクトボックスのラベルも変数名からまとめて変換できるので便利です。
フォームを作るときはこの塊をコピペしまくって、selectだったりtextなど配置したいフォーム要素に応じて調整していけば、何回もtypeとかを書かなくて済みます。
以上、自分がCakePHPでよく使う書き方のサンプルやちょっとした部品についての紹介でした。
CakePHPを使ったWebシステム開発をされている方の参考になれば幸いです。