Symfony - 如何从表单事件中调用Service Container对象?

时间:2017-05-23 11:27:14

标签: forms symfony events service

如何从表单事件中调用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

2 个答案:

答案 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'];
    //...
}