LoginSignup
12
13

More than 5 years have passed since last update.

CakePHP3でバリデーションエラーをリダイレクト先に表示する方法

Last updated at Posted at 2015-10-31

動作するコード

actionの引数$idnullの時、Userテーブルにユーザ情報を新規登録し、
$idが数値の場合に既存ユーザ情報をフォームに展開して更新処理を行わせる画面の想定。

自分自身にPOST → 保存処理 → 自分自身にリダイレクト(GET)という、
GETとPOSTの役割を明確に切り分ける実装を想定しています。

UserController.php
use Cake\Routing\Router;

class UserController extends BaseController 
{
    public function edit($id = null) 
    {
        $table   = TableRegistry::get('User');
        $session = $this->request->session();

        if ($this->request->is('post')) 
        {
            // newEntityもバリデーション効果を持つ
            $entity = $table->newEntity($this->request->data['User']);

            // バリデーションエラーを検出
            if ($entity->errors())
            {
                // バリデーションエラー情報をエンティティごとセッションへ保存
                $session->write('ValidationError', $entity);
                return $this->redirect(Router::url());
            }

            // 保存処理
            $table->save($entity);
            return $this->redirect(Router::url());
        }

        // セッションにバリデーションエラーを保持したエンティティが保存されていないか調査
        $set_user = $session->read('ValidationError');
        $set_user = ! empty($set_user) ? $set_user : $table->find()->where(['id' => $id])->first();

        // エンティティはきちんと削除
        $session->delete('ValidationError');

        // TemplateにUserエンティティを送る
        $this->set('user', ['User' => $set_user]);
    }
}
edit.ctp
<?= $this->Form->create($user) ?>
    <?= $this->Form->input('User.name') ?>
    <?= $this->Form->submit() ?>
<?= $this->Form->end() ?>

注意するポイント

バリデーションエラーは、Entityに格納したままリダイレクト先に引き継ぎましょう。
前回の記事に引き続き、Form::createの第一引数にEntityの配列を渡すことも忘れずにお願いします。

Entityが予期せぬタイミングで取れるとマズいので、セッションを使った後はしっかり削除して下さい。
アクセスする度に必ず消えるセッションを定義しておくと消し忘れがなくていいと思います。
CakePHPのフラッシュセッションはメッセージ表示に特化しているので、もっとラフに使えるものを自分で用意すると良いでしょう。

12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13