質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Symfony2

Symphony2は、簡単で速く堅牢なプログラムの開発サイクルに焦点を当てた、オープンソースのPHPウェブアプリケーション開発フレームワークです。PHP version 5.3.3以上を対象としています。

Symfony

Symfony はPHPで記述されたWebアプリケーションフレームワークです。よく利用するコーディングをテンプレーティングするなど、Webアプリケーション開発の効率化を目的として設計されています。

Q&A

2回答

5648閲覧

SymfonyのForm FieldTypeのrequiredについて

marimo.

総合スコア48

Symfony2

Symphony2は、簡単で速く堅牢なプログラムの開発サイクルに焦点を当てた、オープンソースのPHPウェブアプリケーション開発フレームワークです。PHP version 5.3.3以上を対象としています。

Symfony

Symfony はPHPで記述されたWebアプリケーションフレームワークです。よく利用するコーディングをテンプレーティングするなど、Webアプリケーション開発の効率化を目的として設計されています。

0グッド

0クリップ

投稿2016/10/14 03:39

以前似たような質問をしたのですが回答を得られなかったので、再度質問させていただきました。

SymfonyのForm FieldTypeにrequiredがあると思いますが、Symfony Japanのドキュメントを見るとrequiredについて「表面的でバリデーションからは独立しています」と書かれております。
バリデーションから独立とはどういうことなのでしょうか?
ではrequired => trueというのはバリデーションではなく、いったい何を確認しているのでしょうか?

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

広義の意味では 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コードが書き換えられてもサーバーサイドでバリデーションがかかっているので処理は通りません。

これが requiredconstraints の違いになります。

required => true はサーバーにリクエストを飛ばさない分、レスポンスが早いですし、実装も手軽ですが、しっかりとバリデーションをかけるならば、 constaints による指定もしたほうがいいです。

投稿2018/02/08 13:52

tomcky

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ちゃんとよんでますか?

trueの場合は HTML5 の required 属性 がレンダリングされます。
対応する label もまた required クラスをレンダリングします。

とあります。

つまり

<input name="q" required>

のように required が付与されます。

ブラウザベースの検証( FormValidation )

投稿2016/10/16 03:58

編集2016/10/16 05:10
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marimo.

2016/10/16 04:14

input formにrequiredが付与されることは承知しています。 required、つまりこのinput formが必須項目になったと思っている(つまりバリデーションが働いていると思っている)のですが、ドキュメントにrequiredは「バリデーションから独立している」とあったので混乱している次第です。 おそらく当方が間違った理解をしていると思っているのですが、それがどこだかわからない、という質問です。 これで伝わるでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問