Я следую учебному пособию Как динамически генерировать формы с помощью событий формы .Я застрял на создании AddNameFieldSubscriber
:
$subscriber = new AddNameFieldSubscriber($builder->getFormFactory());
Мой вопрос прост: как FormFactory
может получить доступ и изменить поле произвольной формы, ранее созданное $builder
?И почему мы передаем FormFactory
вместо самого $builder
?
Предполагая, что у нас есть только два поля ("имя" и "цена") в построителе :
class ProductType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$subscriber = new AddProductTypeSubscriber($builder->getFormFactory());
$builder->addEventSubscriber($subscriber);
$builder->add('name');
$builder->add('price');
}
public function getName() { return 'product'; }
}
Я бы хотел установить required = false
(просто пример) в подписчике :
class ProductTypeSubscriber implements EventSubscriberInterface
{
private $factory;
public function __construct(FormFactoryInterface $factory)
{
$this->factory = $factory;
}
public static function getSubscribedEvents()
{
return array(FormEvents::PRE_SET_DATA => 'preSetData');
}
public function preSetData(DataEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if (null === $data) return;
// Access "name" field and set require = false
}
}