広義の意味では required
もバリデーションです。
ですが、Symfonyで提供されているバリデーションではなく、HTML5で提供されているバリデーションであり、全く別のものです(多分ですが、ドキュメントの「バリデーションから独立している」というのは「Symfonyの機能としてのバリデーションから」という意味だと思います)。
required => true
としたときに付与される required
はHTML5で提供されているバリデーションを有効化します。
このバリデーションが動作したときの画像が以下です。
このバリデーションが動作するのはsubmitされる前であり、ブラウザが入力をチェックして結果を返しています(なのでブラウザによって表示が違ったり動作しなかったりします)。
つまり、これはフロントエンドのみでバリデーションが動作していることを示しており、サーバーサイドの処理は全く関係ありません。
これだけでもバリデーションが動作しているため一見問題ないように思えますが、不十分です。
例えば、ChromeであればDeveloper Toolsを開いて、required="required"
をHTMLコードから削除してみてください。
するとバリデーションは動作せず、submitされてしまうはずです。
このように、HTML5の required
によるバリデーションは簡単に突破できます。
しっかりとバリデーションをかけるならサーバーサイドでの実装も必須です。
さて、ここで出てくるのが constraints
です。
これが、サーバーサイドでのバリデーション、つまりSymfonyで提供されているバリデーションを有効化するためのオプションになります。
'constraints' => [ new NotBlank() ]
かつ required => false
としたときの動作が以下のとおりです。
'constraints' => [ new NotBlank() ]
となっている場合は、もし先に挙げたようにHTMLコードが書き換えられてもサーバーサイドでバリデーションがかかっているので処理は通りません。
これが required
と constraints
の違いになります。
required => true
はサーバーにリクエストを飛ばさない分、レスポンスが早いですし、実装も手軽ですが、しっかりとバリデーションをかけるならば、 constaints
による指定もしたほうがいいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。