追記:この変更は3.2.10でリバートされました
CakePHP3.2.9がリリースされたのでアップデートしたらテストが通らなくなってしましました…
どうやらexistsInが更新されたことが原因のようです。
(変更箇所:Force ExistsIn rule in new Entiy even with a not dirty field)
今まで以下のような感じの処理をしていました。
src/Controller/ArticlesController.php
public function add()
{
$article = $this->Articles->newEntity();
if ($this->request->is('post')) {
$article = $this->Articles->patchEntity($article, $this->request->data);
$article->user = $this->Users->get($this->Auth->user('id'));
if ($this->Articles->save($article)) {
return $this->redirect(['action' => 'index']);
} else {
$this->Flash->error(__('保存できません'));
}
}
src/Model/Table/ArticlesTable.php
public function buildRules(RulesChecker $rules)
{
$rules->add($rules->existsIn(['user_id'], 'Users'));
return $rules;
}
Controllerでuser_idではなくuserをentityの形で$article->user
にセットしているので、$article->user_id
はセットされていないため、existsIn()
がエラーを返すようになったようです。
今まではuser_idがセットされてなかったらチェックしてなかったけど、新規作成の時はそれは許されなくなったぽい?
というわけで、なんか釈然としないけど、以下を追加しました。
src/Model/Table/ArticlesTable.php
public function beforeRules($event, $entity, $options, $operation)
{
if (!empty($entity->user)) {
$entity->user_id = $entity->user->id;
}
}
エラーは出なくなったけど、これでいいのかどうか…。