如何从表单事件中调用Service Container对象?
我创建了一个网站管理员可以创建图书的表单。我希望在通过此表单创建工作簿时创建Sylius产品:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', TextType::class, array(
'attr' => array('class'=>'block1')
))
->addEventListener(
FormEvents::PRE_SET_DATA,
array($this, 'onPreSetData')
)
;
}
public function onPreSetData(FormEvent $event)
{
$book = $event->getData();
$form = $event->getForm();
$productFactory = $this->container->get('sylius.factory.product');
}
为此目的,我需要达到' sylius.factory.product'服务如下所述:http://docs.sylius.org/en/latest/book/products/products.html
$productFactory = $this->container->get('sylius.factory.product');
我可以从任何Controller访问它,但不幸的是我无法从我定义的BookType类访问它。
当我尝试从buildForm()或onPreSetData()函数访问它时,Symfony返回的错误如下:
注意:未定义的属性:FrontendBundle \ Form \ BookType :: $ container
答案 0 :(得分:1)
通过选项
将服务传递到表单答案 1 :(得分:0)
实际上,这个过程在Symfony文档中得到了很好的解释:http://symfony.com/doc/current/form/form_dependencies.html
所以我更新了我调用表单的方式:
$editForm = $this->createForm($form, $item, array( //WITH SYLIUS
'sylius_factory_product' => $this->get('sylius.factory.product')
));
相反:
$editForm = $this->createForm($form, $item); //WIHOUT SYLIUS
另外,我改编了configureOptions函数:
public function configureOptions(OptionsResolver $resolver)
{
$resolver
->setDefaults(array(
'data_class' => 'FrontendBundle\Entity\Book'
))
->setRequired('sylius_factory_product')
;
}
相反:
public function configureOptions(OptionsResolver $resolver)
{
$resolver
->setDefaults(array(
'data_class' => 'FrontendBundle\Entity\Book'
))
;
}
您现在可以在buildForm函数中访问您的服务,如下所示:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$productFactory = $options['sylius_factory_product'];
//...
}