Как передать параметр в конструктор 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 Пропустите Глобальные настройки для конструктора (или служб)
![введите описание изображения здесь]()
![введите описание изображения здесь]()