CakePHP3.2.9로의 업데이트에서 오류를 반환하게 된 existsIn을 처리하는 이야기

추가: 이 변경사항은 3.2.10에서 리버트되었습니다.

CakePHP3.2.9가 릴리스 되었기 때문에 업데이트하면 테스트가 통과하지 않게 되어 버렸습니다…
분명히 existsIn이 업데이트되었기 때문입니다.
(변경 개소: Force Exists In rule in new Entity 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;
    }
}

에러는 나오지 않게 되었지만, 이것으로 좋은 것인가…

좋은 웹페이지 즐겨찾기