Open1

[symfony/Form] Formクラス内で、別フィールドの値を受け取る方法に関する考え

tanaka_tarotanaka_taro

環境

Symfony6, 6.4
UX Live Component を含む

概要

Formクラスで追加の値を持たせたい事がある。次の例では_key という追加のフィールドを設定している。

class LifeActivityLogFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $entity = $options['data'] ?? null;

        $builder
            ->add('name', TextType::class, [
                'empty_data' => '',
            ])
            ->add('has_checked', CheckboxType::class, [
                'required' => false,
                'label' => false,
            ])
            ->add('life_activity_category', EntityType::class, [
                'label' => 'カテゴリ',
                'class' => LifeActivityCategory::class,
                'empty_data' => '1',
            ])
            ->add('_key', HiddenType::class, [
                'data' => (empty($entity) ? null : $entity->getCode()),
                'mapped' => false,
            ]) 
        ;
    }
}

なぜこんな事してるのかというと、View側(テンプレート)で追加したデータにアクセスしたいから。上記の様に _key を追加すると、次のようにして値にアクセス出来る。

{{ form._key.vars.value }}

上記の様にしてFormクラスから値を取りたい場面というのは限られていると思う。というのも、Formクラス経由で値を取るんじゃなくて、コントローラ内でtwigに値を渡す事で済むことが多い。私は次の場面でFormクラス経由で値を取る必要があった

  • Formのビューが複数ある場合。配列にフォームを入れて、それをtwigの方でループさせて表示させるとき
  • Formクラスに別のFormクラスを埋め込んで、それをtwigの方でループさせて表示させる