【CakePHP】read()とvalidates()の相性は良くない

CakePHP 1.3.2】

【結論】
バリデーションに失敗して元のフォーム画面に戻る処理の中で、
『$this->Model->read()』を使ってはいけません。
readメソッドの中に下記のような記述があるため、バリデーションに
失敗した旨のメッセージが消えてしまいます。

【/cake/libs/model/model.php 1108行目】
function read($fields = null, $id = null) {
$this->validationErrors = array();
...

バリデーションに失敗した場合、『$this->validationErrors』
には下記のような情報が格納されます。


【print_r($this->validationErrors)】
Array
(
[User] => Array
(
[mail] => 正しいメールアドレスを入力してください。
[password_tmp] => 確認用のパスワードと一致していません。
)

)

これらの情報が、ごっそり消えてしまうことになります。


【実例】




【ビュー:edit_mail.ctp】
<h2>メールアドレス変更</h2>
<p>現在のメールアドレス:<?php echo $this->data['User']['mail']; ?></p>
<?php
echo $form->create('User');
echo $form->input('mail_new', array('label'=>'新しいメールアドレス'));
echo $form->input('id', array('type' => 'hidden'));
echo $form->end('登録する');
?>

現在のメールアドレスを表示するため、コントローラからビューへ
ユーザの情報を渡す必要があります。
バリデーションに失敗した場合は、エラーメッセージも隠れて
渡されています。


【コントローラ:users_controller.php
//最初の『$this->data』にはフォームから送信されてきた情報が格納されている。

【失敗】
$this->User->set($this->data);
if(!$this->User->validates()){
//バリデーションに失敗したため、フォーム画面に戻る。
//そのために、ユーザ情報をもう一度読み込む。
$this->data = $this->User->read(null, $this->data['User']['id']);
return;
}

【成功】
$this->User->set($this->data);
if(!$this->User->validates()){
$this->data = $this->User->find('first', array(
'conditions'=>array('id'=>$this->data['User']['id'])
));
return;
}

readではなくfindを使えば、バリデーションに失敗した場合の
メッセージがきちんと表示されます。