2016-04-11 25 views
2

的EventSubscriber中注入實體管理器這是我第一次使用表單的EventListener,所以我在如何注入EntityManager中苦苦掙扎。Symfony - 在表單

我有這個formType稱爲UserType在這個類我有一個EventSubscriber AddDepartmentDegreeCourseFieldSubscriber其需要訪問的EntityManager

class UserType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->addEventSubscriber(new AddProfileFieldSubscriber()); 
     $builder->addEventSubscriber(new AddDepartmentDegreeCourseFieldSubscriber()); 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\User' 
     )); 
    } 
} 

這是我services.yml

app.department_course_degree_subscriber: 
    class: AppBundle\Form\EventListener\AddDepartmentDegreeCourseFieldSubscriber 
    arguments: ["@doctrine.orm.entity_manager"] 
    tags: 
     - { name: kernel.event_subscriber } 

我得到的錯誤是如下

Catchable Fatal Error: Argument 1 passed to AppBundle\Form\EventListener\AddDepartmentDegreeCourseFieldSubscriber::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in /Users/shairyar/Sites/oxford-portal/src/AppBundle/Form/UserType.php on line 21 and defined

我知道錯誤的意思,但我認爲我在services.yml註冊的服務應該注入EntityManager,爲什麼我得到這個錯誤?我在這裏錯過了什麼?任何幫助將非常感激。

+0

如何創建窗體對象?你必須使用容器來獲取formType。 – codeneuss

+0

@ v.eigler形式在控制器中創建'$ profileForm = $ this-> createForm(UserType :: class,$ userInfo);'如果我理解你的問題的權利。 – Baig

+0

重複:http://stackoverflow.com/questions/24876767/inject-symfony-entitymanager-into-form-type-via-services – codeneuss

回答

3

這是因爲您在構建表單時通過AddDepartmentDegreeCourseFieldSubscriber的新實例。您需要從服務容器傳遞實例。

use AppBundle\Form\EventListener\AddDepartmentDegreeCourseFieldSubscriber; 

class UserType extends AbstractType 
{ 
    private $addDepartmentDegreeCourseFieldSubscriber; 

    public function __construct(AddDepartmentDegreeCourseFieldSubscriber $subscriber) 
    { 
     $this->addDepartmentDegreeCourseFieldSubscriber = $subscriber; 
    } 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->addEventSubscriber($this->addDepartmentDegreeCourseFieldSubscriber); 
    } 
} 
# app/config/services.yml 
services: 
    app.department_course_degree_subscriber: 
     class: AppBundle\Form\EventListener\AddDepartmentDegreeCourseFieldSubscriber 
     arguments: ["@doctrine.orm.entity_manager"] 
     tags: 
      - { name: kernel.event_subscriber } 

    app.form.type.my_user_form: 
     class: AppBundle\Form\UserType 
     arguments: [ "@app.department_course_degree_subscriber" ] 
     tags: 
      - { name: form.type } 
+0

非常感謝,我會看看,並得到回到 – Baig

+0

這實際上是我在談論的解決方案。我試過了,但認爲EventSubscriberInterface存在問題,因爲getSubscribedEvents()方法是靜態的。 – codeneuss

+0

工作完美,謝謝 – Baig