Как передать параметр в конструктор FormType из контроллера

В Symfony2.7 я смог передать параметр в конструктор Type Type непосредственно из контроллера при создании формы, однако в Symfony3 я не могу этого сделать!

До в Symfony2.7

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

После в Symfony3

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

Update: Я также хотел получить к нему доступ:

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

Любая помощь будет высоко оценена.

Ответ 1

Спасибо за ваше время! Я решил это сам:

Я удалил параметр из конструктора NewsType и добавил данные в поле formBy form, используя массив $options, и передал данные в массив $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(),
);

UPDATE: Пожалуйста, используйте нижеприведенный код, если вы хотите получить доступ к массиву $options из addEventListener:

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

Надеюсь, что это поможет кому-то!  

Ответ 2

Вам нужно определить форму как услугу.

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 }

Ответ 3

Вы оба правы.

@Muzafar и @jkucharovic, вопрос в том, когда использовать, который...

Как показывает Бернард Шуссек в Symfony Forms 101:

1 Не передавать Динамические данные в конструктор..

введите описание изображения здесь

2... но используйте Нестандартные параметры вместо

введите описание изображения здесь

3 Пропустите Глобальные настройки для конструктора (или служб)

введите описание изображения здесь

введите описание изображения здесь