【symfony2】FormTypeのtips
symfony2でフォームを使用したいときはほとんどの場合、FormTypeを用いて作成します。
FormTypeはバリデーションの一元管理ができて非常に便利なのですが、
公式ドキュメントに丁寧な記載のない事も多く、実現したい機能に辿り着くまで時間を要することもあります。
今回は直近の開発で使った使用例を何個かご紹介します。
指定文字数丁度かを確認する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface as FormBuilder; use Symfony\Component\Validator\Constraints as Assert; class FormType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder ->add('foo', TextType::class, array( 'label' => 'bar', 'mapped' => false, 'constraints' => array( new Assert\Length(array( 'min' => 8, 'max' => 8, )) ), )); } } } |
携帯番号や郵便番号、各種登録番号など文字数が確定している数値を指定したい際のバリデーション記述です。
minとmaxを同時に指定することで実現します。(今回の例では8文字です。)
0始まりの文字列が数字のみか確かめるバリデーション
単純に文字列が数値のみか確かめる場合はNumberTypeやIntegerTypeを使用することで解決します。
しかし文字列が「0120」だった場合は整数「120」として処理されてしまい、意図しない挙動になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface as FormBuilder; use Symfony\Component\Validator\Constraints as Assert; class FormType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder ->add('foo', TextType::class, array( 'label' => 'bar', 'constraints' => array( new Assert\Regex(array( 'pattern' => '/^[0-9]+$/', )) ), )); } } |
textTypeを用い、そこに正規表現指定を加えることで解決が可能です。
条件によってFormTypeの項目を増減する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface as FormBuilder; use Symfony\Component\Validator\Constraints as Assert; class FormType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder ->add('foo1', TextType::class, array( 'label' => 'bar1', 'required' => true, )); if ($options['check'] === true) { $builder ->add('foo2', TextType::class, array( 'label' => 'bar2', 'required' => true, )); } } } |
至ってシンプルな記述方法です。
入力時の条件によって必須項目が増減する場合などに使用します。
引数$optionsの[‘check’]の値がtrueの場合のみ、foo2の必須項目が追加されます。
Author Profile
スターフィールド編集部
SHARE