動作するコード
actionの引数$id
がnull
の時、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のフラッシュセッションはメッセージ表示に特化しているので、もっとラフに使えるものを自分で用意すると良いでしょう。