2017-05-23 65 views
-1

如何從窗體事件調用Service Container對象?Symfony - 如何從表單事件調用服務容器對象?

我創建了一個表單,網站管理員可以創建書籍。我想創建一個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」服務爲解釋有:​​

$productFactory = $this->container->get('sylius.factory.product'); 

我可以從任何控制器訪問它,但不幸的是,我無法從我定義的BookType類訪問它。

下面是Symfony的返回,當我嘗試從buildForm()或onPreSetData訪問它()函數的錯誤:

公告:未定義的屬性:FrontendBundle \表格\的BookType :: $容器

+0

化妝'BookType'的服務,並通過'@ sylius.factory.product'作爲參數傳遞給它。 – ArtOsi

回答

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']; 
    //... 
} 
+0

是什麼讓你選擇這種方法,而不是簡單地將表單類型定義爲服務,然後不必擔心必須將工廠注入到選項中? – Cerad

+0

我不知道這種方法。如果我將BookType類定義爲服務,我是否可以訪問所有工廠/服務對象?你可以解釋嗎? – 118218

+0

http://symfony.com/doc/current/form/form_dependencies.html – Cerad

相關問題