ichikawa です。
ここで以前にもvalidationの記事を書いたのですが、もうvalidationを実行したときの流れも知っておきあたかったのでまた書きます。
以前の記事
- validationについて学ぶby muroi
- askeetチュートリアル5,6日目ログインフォームとバリデーションby ichikawa
フォームから送られてきたリクエストにバリデーションをかける際、
myModule/validate/myAction.yml を作成し、エラーがあった場合の処理を actions.class.php内に handleErrorMyAction としてメソッドを書くことは学びました。
その先がどうなっているのかなかなか複雑そうなので、調べてみました。
- 送られたリクエストがバリデーションでのチェックに引っかからなかった場合
- actions.class.php の executeMyAction メソッドを実行、myActionSuccess.php テンプレートが呼び出されます。
- 送られたリクエストがバリデーションでのチェックに引っかかった場合(エラーの場合)
- actions.class.php の handleErrorMyAction メソッドを実行しますが、この後、デフォルトでは myActionError.php を出力します。前回の記事では、エラーが生じた場合にも loginSuccess.php テンプレートを表示したかったので、handleErrorLogin メソッドの最後に return sfView::SUCCESS; と入力したのでした。
また、 handleErrorMyAction メソッドが存在しない場合も、myActionError.phpを出力します。それもない場合は、サーバーエラーの画面が表示されます。 - エラーメッセージを表示
- テンプレートが呼び出されれば、そこでエラーメッセージを表示させるためには、validationヘルパ関数を使うと楽にできます。
前回使ったのは form_error(’パラメータ名’) ですがこれはとても便利で、エラーがあったときだけ表示できる優れものです。しかしこれは一つ一つエラーメッセージを呼び出すには良いかもしれませんが、
エラーがたくさんあって、全部出力したい時には $sf_reqest を使った下のような書き方がスマートかもしれません。//エラーがあるかチェック <?php if ($sf_request->hasErrors()):?> //エラーをリストにして表示 <ul> <?php $errors = $sf_request->getErrors();?> <?php foreach ($errors as $error):?> <li> <?php echo $error;?></li> </ul> <?php endforeach; ?>
以上がバリデーションを行うことの大体の流れです。途中の sfView::SUCCESS が気になったのでこちらもちょいと調べてみました。
sfView クラスはどこにあるのかなと、探ってみたところ symfony のsymfony/view/にありました、sfView.class.php。
ここで送られてきた文字列を定数を定義しているところです。
sfView::ALART とか sfView::INPUT とかあるみたいですが、これらは sfView::SUCCESS を返す時と同じことで、これらを返すと myActionAlart.php や myActionInput.php テンプレートを探して表示するようです。
handleErrorMyAction メソッドでは何も指定しないと myActionError.phpを表示しようとするのは、デフォルトで sfView::ERROR を返しているのですね。
と考えると executeMyAction では sfView::SUCCESS を返しているのです。
なるほど。
symfony自体に組み込まれているクラスやヘルパは、ソースを見る事でどんなものか理解するのに良い方法だと思いました。
これからも、どういう仕組みか分からないときは、ソースを追ってみて理解していみようということにしました。

コメントをどうぞ