我使用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
您正在使用哪個版本的Symfony。 2.8/3.0有重大的形式變化。 – Cerad
通過symofny2中的構造函數傳遞一些東西給formType並不是一個好習慣,請使用第三個參數(options),其次,爲什麼你想在form Type中使用實體管理器?也許我們可以找到更好的方法來解決您的問題 –
請嘗試添加一些關於該問題的其他信息。另外,在'var_dump($ this-> em);'後面添加代碼可能對幫助解決問題很有幫助。 – levelonehuman