2016-01-23 2 views
0

У меня есть Доктрина Entity, которая использует Doctrine embeddable.Формы Symfony: как включить в Entity Doctrine форму для встраивания Doctrine, используемого самой сущностью

Я хочу, чтобы создать форму для редактирования Entity и Embeddable.

Мои Entity:

/** 
* MyEntity 
* 
* @ORM\Table(name="my_entities") 
* @ORM\Entity(repositoryClass="\AppBundle\Entity\MyEntityRepository") 
* @ORM\HasLifecycleCallbacks 
*/ 
class MyEntity 
{ 
    ... 

    /** 
    * @var MyEmbeddableInfo 
    * 
    * @ORM\Embedded(class="AppBundle\Entity\Embeddable\MyInfoEmbeddable") 
    */ 
    private $myInfo; 

    ... 

Мои Embeddable:

/** 
* @ORM\Embeddable 
*/ 
class MyInfoEmbeddable 
{ 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="info1", type="string", nullable=true) 
    * 
    * @Assert\NotBlank(groups={"setUp"}) 
    */ 
    private $info1; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="info2", type="string", nullable=true) 
    * 
    * @Assert\NotBlank(groups={"setUp"}) 
    */ 
    private $info2; 

    /** 
    * @var 
    * 
    * @ORM\Column(name="info3", type="string", nullable=true) 
    * 
    * @Assert\NotBlank(groups={"setUp"}) 
    */ 
    private $info3; 

    ... 

, что я попытался

Я нашел это question here on Stackoverflow и кажется, что пользователь имел мою же проблему, но разница в том, что я никогда не получаю это Warning, поскольку я просто не понимаю Основная процедура создания формы для встраиваемого объекта.

Я делаю два теста: один проходит непосредственно встраиваемый объект в конструктор форм MyEntityType и один создает тип формы MyInfoType().

ТЕСТ 1: PASS НАПРЯМУЮ встраиваемого ОБЪЕКТ

Это код моего MyEntityType класса:

class MyEntityType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ... 
      ->add('myInfo', 'entity', ['class' => '\AppBundle\Entity\Embeddable\MyInfoEmbeddable']) 
      ... 
    } 

    public function getName() 
    { 
     return 'MyEntity'; 
    } 
} 

Это решение бросает RuntimeException:

Класс \AppBundle\Entity\Embeddable\MyInfoEmbeddable, кажется, не должно быть управляемого объекта Doctrine. Вы забыли его нарисовать?

ТЕСТ 2: пропускание MyInfoType ОБЪЕКТА

Второй тест я делаю использую тип формы (как это было предложено в linked SO question):

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ... 
      ->add('myInfo', new MyInfoType()) 
      ... 
    } 

И это код MyInfoType:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('infoField1', 'text', ['required' => false]) 
     ->add('infoField2', 'text', ['required' => false]) 
     ->add('infoField3', 'choice', [ 
       'choices' => [ 
        '' => '', 
        'choice1' => 'Choice 1', 
        'choice2' => 'Choice 2', 
        'choice3' => 'Choice 3' 
       ], 
       'required' => false 
      ] 
     ); 
} 

Thi s, вместо этого, возвращает Symfony\Component\PropertyAccess\Exception\NoSuchIndexException:

Не удается прочитать индекс infoField1 от объекта типа AppBundle\Entity\Embeddable\MyInfoEmbeddable, поскольку он не реализовать \ArrayAccess.

Итак, это решение тоже не работает.

Моя цель - создать форму для MyEntity и в этой форме создать также все поля для обновления MyInfoEmbeddable.

Какая правильная процедура следовать?

ответ

2

Вместо этого в основной форме:

$builder->add('myInfo', new MyInfoType(), 
['data_class' => '\AppBundle\Entity\Embeddable\MyInfoEmbeddable']) 

Вы можете добавить это в виде MyInfoType (который, я полагаю, связан с встраиваемым объектом):

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'data_class' => '\AppBundle\Entity\Embeddable\MyInfoEmbeddable', 
    ]); 
} 

А потом просто Invoke встраиваемого типа формы в основной форме, как это:

$builder->add('myInfo', new MyInfoType()) 
1

После некоторых других запросов с различными keywords я придумал this answer here on SO, что помогло мне решить проблему.

Я действительно был рядом с решением. Я просто опустил требуемый параметр, чтобы создать форму.

Решение передать параметр data_class в add() способе FormBuilder:

... 
$builder 
    ->add('myInfo', new MyInfoType(), ['data_class' => '\AppBundle\Entity\Embeddable\MyInfoEmbeddable']) 
... 
+1

Я знаю, это quastion вкуса, но я предлагаю, чтобы переместить атрибут «data_class» из поля призыва в основной форме configureOptions для вашей встраиваемой формы. –

+0

Можете ли вы написать ответ, чтобы выяснить, что вы имеете в виду? – Aerendir

Смежные вопросы