У меня есть Доктрина 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
.
Какая правильная процедура следовать?
Я знаю, это quastion вкуса, но я предлагаю, чтобы переместить атрибут «data_class» из поля призыва в основной форме configureOptions для вашей встраиваемой формы. –
Можете ли вы написать ответ, чтобы выяснить, что вы имеете в виду? – Aerendir