先日cakephp3のvalidationのひとつ、notEmptyではまったので書き留めておく。
notEmptyは空のフィールドを認めないが、フィールドが存在しないことは認めてしまうようだ。
結果としてバリデーションが効かず、DB上で空のフィールドが発生することがある。
例えば以下のような場合。
1 2 3 4 5 6 |
public function validationDefault(Validator $validator) { $validator ->notEmpty('title'); return $validator; } |
1 2 3 |
$data = array(); $entity = patchEntity($entity, $data); |
$entityのtitleのメンバは空ではない(そもそも存在しない)のでバリデーションに引っかからない。
このままsaveすると保存されてしまう。
これを防ぎたい場合、別にフィールドが存在しないことを認めないrequirePresenceをつけてやる必要がある。
1 2 3 4 5 6 7 |
public function validationDefault(Validator $validator) { $validator ->requirePresence('title') ->notEmpty('title'); return $validator; } |
これならtitleが存在しない場合もバリデーションが機能する。
ただし、requirePresenceは$dataに相当する部分をチェックしているらしい。
カラムを更新したい場合は気を付けなければならない。
以下のようなものは引っかかるのでダメ。
1 2 3 4 |
$entity = $result //titleがすでに存在するもの $data = array('body' => 'hogehoge'); $entity = patchEntity($entity, $data); |
こうすれば解決する。
1 |
$data = array('title' => $result->title , 'body' => 'hogehoge'); |
おわり