Symfonyで 開発中のプロジェクトでvalidateのコードを減らしたく、Form Type Options Guessingを色々と試した結果を共有します( Symfony4.3 )。
参考:https://symfony.com/doc/4.3/forms.html#form-type-options-guessing
1.既存のコード
FormBuilder記述
add('sort', TextType::class)
Entity記述
@ORM\Column(type="integer")
生成HTML
<input type="text" id="..." name="..." required="required">
(以降、id/name/required属性は省略)
type=”text”の場合、EntityでsetSort(?int)などと型指定していると、数値でない”a”などをsubmitした際にPropertyAccessorでInvalidArgumentExceptionが発生してしまう。
2.クラスを省略
FormBuilder
add('sort')
Entity
@ORM\Column(type="integer")
HTML
<input type="number">
type=”number”になった。
3.Rangeアノテーションを追加
FormBuilder
add('sort')
Entity
@ORM\Column(type="integer")
@Assert\Range(min="0", max="99999")
HTML
<input type="number" maxlength="5" pattern=".{1,}">
maxlength/pattern属性は増えたが、min, max属性は付けてくれない。
type=”number”の場合maxlength属性が効かない様で、123456の様な値でsubmitできてしまう(以降Chrome78で確認)。
4.add()の引数でmin/maxを指定
FormBuilder
add('sort', null, ['attr' => ['min' => 0, 'max' => 99999]])
Entity
@ORM\Column(type="integer")
@Assert\Range(min="0", max="99999")
HTML
<input type="number" maxlength="5" pattern=".{1,}" min="0" max="99999">
123456は入力できるがsubmitはできない。
5.add()の引数でpatternも指定
FormBuilder
add('sort', null, ['attr' => ['min' => 0, 'max' => 99999, 'pattern' => '\d{1,5}']])
Entity
@ORM\Column(type="integer")
@Assert\Range(min="0", max="99999")
HTML
<input type="number" maxlength="5" pattern="\d{1,5}" min="0" max="99999">
type=”number”の場合pattern属性が効かない様で、123456が入力できる。submitはできない。
結局、開発中のプロジェクトでは3.で進めることにしました。