blogチュートリアル(10) データのバリデーション

前のステップで、データを追加するフォームのタイトルや本文に何も入力しなくても、データが登録されてしまうことに気づいた方もいらっしゃるでしょう。

今回は、このフォームのウィジェットにバリデーションルールを設定して、空文字列のデータが登録されないようにします。

バリデーターの設定

フォームにバリデーションを設定するには、フォームクラスで対応するフィールドにバリデーターを設定します。 lib/form/doctrine/PostForm.class.phpをエディタで開き、configureメソッドを以下のように修正してください。

public function configure()
{
  $this->useFields(array('id', 'title', 'body'));
 
  $ws = $this->getWidgetSchema();
  $ws['title']
    ->setAttribute('maxlength', 50);
  $ws['body']
    ->setAttribute('cols', 30)
    ->setAttribute('rows', 3);
 
  $vs = $this->getValidatorSchema();
  $vs['title']
    ->setOption('required', true)
    ->setMessage('required', '未入力です');
  $vs['body']
    ->setOption('required', true)
    ->setMessage('required', '未入力です');
}
 

このコードでは、titleフィールド、およびbodyフィールドのそれぞれのバリデーターを設定しなおしています。 また、titlebodyウィジェットのHTML属性も設定しています。

各バリデータに、required(必須かどうか)の設定と、それらがエラーだった場合のエラーメッセージを指定しています。

CakePHPの場合、フィールドのバリデーションをモデルに記述するのに対して、symfonyの場合はモデルとフォームとは(連携していますが)独立しています。 したがって、フォームのフィールドのバリデーションはフォームクラスに記述します。

コードを編集したら保存して、ブラウザで再度入力フォームに戻り、バリデーションが正しく動作していることを確認してみましょう。

フォームのベースクラス(BasePostForm.class.php)には、生成されたデフォルトのウィジェットやバリデーターが記述されています。 このクラスのコードを見ると、文字列のフィールドでは、フィールドサイズによって自動的にバリデーションルールが設定されていることがわかります。 スキーマでフィールドをnot nullに設定した場合は、バリデーターにrequired=trueオプションが設定されます。