コントローラからFormTypeコンストラクタにパラメータを渡す方法 質問する

コントローラからFormTypeコンストラクタにパラメータを渡す方法 質問する

Symfony2.7 では、フォームの作成時にコントローラーからフォーム タイプ コンストラクターにパラメーターを直接渡すことができましたが、Symfony3 ではそれができません。

Symfony2.7以前

$postedBy = $this->getUser()->getFullname();
$form = $this->createForm(new NewsType($postedBy));

Symfony3 の After

$form = $this->createForm(NewsType::class); // no idea how to pass parameter?

アップデート:以下からもアクセスしたい:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    // how to access posted_by_name here which is sent from controller
}

どのような助けでも大歓迎です。

ベストアンサー1

お時間をいただきありがとうございます。私は自分でこれを解決しました:

NewsType コンストラクターからパラメーターを削除し、$options 配列を使用して postedBy フォーム フィールドにデータを追加し、コントローラーから $options 配列にデータを渡しました。以下を確認してください。

ニュースタイプ

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('postedBy', HiddenType::class, array(
            'data' => $options['postedBy']
          )
        )
    ;
}

// WARNING: this is a MANDATORY block! Only options described here will be allowed to be passed.
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'postedBy' => null,
    ));
}

コントローラ

$form = $this->createForm(NewsType::class, $news, array(
    'postedBy' => $this->getUser()->getFullname(),
);

アップデート:addEventListener から $options 配列にアクセスする場合は、以下のコードを使用してください。

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    $postedBy = $event->getForm()->getConfig()->getOptions()['postedBy'];
}

誰かの役に立てれば幸いです! 

おすすめ記事