2015-12-15 27 views
0

我使用symfony2.7,當我想將entitymanager注入到formtype中時我遇到了問題,但是我沒有看到__construct()在我的服務上被調用,並且注入doesn'工作。 我使用服務將entitymanager注入到我的formtype中。在表單類型中使用服務注入entitymanager

public function createValeurChampNomenclatureAction(Request $request) { 
     $em = $this->getDoctrine()->getManager();   
     $cgaValeurChampNomenclature = new CGAValeurchampnomenclature(); 
     $form = $this->createForm('espritApp_nomenclaturebundle_cgavaleurchampnomenclature', $CGAValeurChampNomenclature); 
.... 

,在我formtype我已創建我的結構

 class CGAValeurChampNomenclatureType extends AbstractType 
{ 

    /** 
* @var EntityManager $entityManager Entity manager 
*/ 
    private $em; 

    /** 
* Constructor 
* 
* @param EntityManager $entityManager Entity manager 
*/ 
    public function _construct(EntityManager $entityManager) 
    { 
     $this->em=$entityManager; 


    } 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     $builder 
      ->add('cgatypenome','entity', array(
        'class' => 'EspritAppNomenclatureBundle:CGATypenomenclature', 
        'property' => 'codeStr', 
        'multiple' => false, 
        'required' => true, 
        'attr'=> array('class'=>'form-control select2 codeStr')) 
        ) 
      ->add('cgacodenomenclature','choice', array('required' => TRUE, 
      'attr' => array('placeholder' => 'Code nomenclature','class'=>'form-control select2 codeNomenclature') 
       )) 
      ->add('cgachamptypenome','choice', array('required' => TRUE, 
      'attr' => array('placeholder' => 'Code Champ','class'=>'form-control select2 codeChampNomenclature') 
       )) 
     ->add('chaCodeStr','text', array('required' => TRUE, 
      'attr' => array('placeholder' => 'Champ code Str','class'=>'form-control') 
       )) 
       ->add('valeur','text', array('required' => TRUE, 
      'attr' => array('placeholder' => 'valeur','class'=>'form-control') 
       )); 


     $formModif = function (FormInterface $form, $codeStr) 
     {    
      $listChampTypeNome = $this->em->getRepository('EspritAppNomenclatureBundle:CGAChamptypenomenclature')->getListChampTypeNomenclatureByCodeStr($codeStr);      
      $listCodeNome = $this->em->getRepository('EspritAppNomenclatureBundle:CGACodenomenclature')->getListCodeNomenclatureByCodeStr($codeStr); 

      if ($listChampTypeNome) { 
       $ChampsTypeNome = array(); 
       foreach($listChampTypeNome as $ChampTypeNome) { 
        $ChampsTypeNome[] = $ChampTypeNome->getCodeChamp();     
       } 
      } else { 
       $ChampsTypeNome = null; 
      } 


      if ($listCodeNome) { 
       $CodesNome = array(); 
       foreach($listCodeNome as $CodeNome) { 
        $CodesNome[] = $CodeNome->getCodeNome();     
       } 
      } else { 
       $CodesNome = null; 
      } 


      $form->add('cgacodenomenclature','choice', array('required' => TRUE, 
      'attr' => array('placeholder' => 'Code nomenclature','class'=>'form-control select2 codeNomenclature'),'choices' =>$ChampsTypeNome) 
       ) 
       ->add('cgachamptypenome','choice', array('required' => TRUE, 
      'attr' => array('placeholder' => 'Code Champ','class'=>'form-control select2 codeChampNomenclature'),'choices'=>$CodesNome) 
       ); 
     }; 

     $builder->get('cgacodenomenclature')->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($formModif){ 
      $formModif($event->getForm()->getParent(),$event->getForm()->getData()); 
     }); 




    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'EspritApp\NomenclatureBundle\Entity\CGAValeurchampnomenclature' 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'espritApp_nomenclaturebundle_cgavaleurchampnomenclature'; 
    } 
} 

,這我在services.yml服務

app.form.type.cgavaleurchampnome: 
     class: EspritApp\NomenclatureBundle\Form\CGAValeurChampNomenclatureType 
     tags: 
      - { name: form.type, alias: espritApp_nomenclaturebundle_cgavaleurchampnomenclature } 
     arguments: [@doctrine.orm.entity_manager] 

,我得到這個錯誤的問題:

Call to a member function getRepository() on a non-object

+0

您正在使用哪個版本的Symfony。 2.8/3.0有重大的形式變化。 – Cerad

+0

通過symofny2中的構造函數傳遞一些東西給formType並不是一個好習慣,請使用第三個參數(options),其次,爲什麼你想在form Type中使用實體管理器?也許我們可以找到更好的方法來解決您的問題 –

+0

請嘗試添加一些關於該問題的其他信息。另外,在'var_dump($ this-> em);'後面添加代碼可能對幫助解決問題很有幫助。 – levelonehuman

回答

1

我懷疑你需要一個使用狀態在這裏訪問$ em:

$em = $this->em; 
$formModif = function (FormInterface $form, $codeStr) use $em 
{ 
    die(get_class($em)); 

雖然這是相當令人費解,爲什麼你這樣做。 http://php.net/manual/en/functions.anonymous.php

+0

我想從另一個列表填充兩個列表框 – ram

+0

我沒有看到__construct()在我的服務上被調用,並且注入不起作用。 – ram

0

您可以很容易地將表單定義爲服務並將其傳遞給EntityManager。對於您應該在表單類型定義getName功能類似:

/** 
* {@inheritdoc} 
*/ 
public function getName() 
{ 
    return 'my_form'; 
} 

定義此表單類型的服務:

app.form.task: 
    class: AppBundle\Form\Type\MyFormType 
    tags: 
     - { name: form.type, alias: my_form } 
    arguments: 
     - "@doctrine.orm.entity_manager" 

之後,你可以在構造函數中獲取EntityManager對象,並在整個使用形成。

/** 
* @var EntityManager $entityManager Entity manager 
*/ 
private $em; 

/** 
* Constructor 
* 
* @param EntityManager $entityManager Entity manager 
*/ 
public function __construct(EntityManager $entityManager) 
{ 
    $this->em = $entityManager; 
} 

用例:

/** 
* {@inheritdoc} 
*/ 
public function finishView(FormView $view, FormInterface $form, array $options) 
{ 
    $users = $this->em->getRepository('AppBundle:User')->findAll(); 

    $view->vars['users'] = $users; 
} 

而且現在你可以在控制器中使用表單類型是這樣的:

$form = $this->createForm('my_form'); 

這就是你想要的?

+0

是的,這正是我需要的@Logans但是當我調用$這個 - > EM-> getRepository我 – ram

+0

嘗試做的@Cerad說:「一個非對象上調用一個成員函數getRepository()」這個錯誤'$ em = $ this-> em;函數(FormInterface $ form,$ codeStr)使用$ em {//其他的東西}' – Logans

相關問題