web-dev-qa-db-ja.com

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

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

Symfony2.7より前

$form = $this->createForm(new NewsType("posted_by_name"));

Symfony3の後

$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
}

どんな助けも大歓迎です。

24
Muzafar Ali

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

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

NewsType

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

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'postedBy' => null,
    ));
}

コントローラー

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

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

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

それが誰かを助けることを願っています!

45
Muzafar Ali

form as service を定義する必要があります。

namespace AppBundle\Form\Type;

use App\Utility\MyCustomService;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class NewsType extends AbstractType
{
    private $myCustomService;

    private $myStringParameter;

    public function __construct(MyCustomService $service, $stringParameter)
    {
        $this->myCustomService   = $service;
        $this->myStringParameter = $stringParameter;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // Your code
    }
}

サービス構成に追加します。

#src/AppBundle/Resources/config/services.yml
services:
    app.form.type.task:
        class: AppBundle\Form\Type\NewsType
        arguments:
            - "@app.my_service"
            - "posted_by_name"
        tags:
            - { name: form.type }
11
jkucharovic

あなたは両方とも正しいです。

@Muzafarと@jkucharovic、質問はどちらを使用するかです...

Bernard Schussekが Symfony Forms 101 で示しているように:

1 動的データをコンストラクタに渡さないでください。

enter image description here

2 ...ただし、代わりにCustom Optionsを使用します

enter image description here

3 グローバル設定をコンストラクター(またはサービス)に渡します

enter image description here

enter image description here

9
Mick