Symfony2 - данные из элемента коллекции форм становятся массивами вместо сущностей - PullRequest
2 голосов
/ 22 июля 2011

У меня есть две сущности Доктрины, которые имеют отношение один ко многим, как это:

Лицензия

class License {    
    /**
     * Products this license contains
     * 
     * @var \Doctrine\Common\Collections\ArrayCollection
     * @ORM\OneToMany(targetEntity="LicenseProductRelation", mappedBy="license")
     */
    private $productRelations;
}

LicenseProductRelation:

class LicenseProductRelation {
    /**
     * The License referenced by this relation
     * 
     * @var \ISE\LicenseManagerBundle\Entity\License
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="License", inversedBy="productRelations")
     * @ORM\JoinColumn(name="license_id", referencedColumnName="id", nullable=false)
     */
    private $license;
}

И у меня есть эта форма для объекта «Лицензия»:

class LicenseType extends AbstractType {

    public function buildForm(FormBuilder $builder, array $options)
    {
        parent::buildForm($builder, $options);
        $builder->add('productRelations', 'collection',
            array('type' => new LicenseProductRelationType(),
                  'allow_add' => true,
                  'allow_delete' => true,
                  'prototype' => true,
                  'label' => 'Produkte'));
    }
}

И эта форма для сущности LicenseProductRelation:

class LicenseProductRelationType extends AbstractType {
    public function buildForm(FormBuilder $builder, array $options) {
        parent::buildForm($builder, $options);
        $builder->add('license', 'hidden');
    }
}

Формы и сущности, конечно же, содержат другие поля, которые здесь не копируются, чтобы сделать сообщение относительно коротким.

Теперь, когда я отправляю форму и связываю запрос с формой в моем контроллере, я ожидаю, что вызов $license->getProductRelations() вернет массив объектов LicenseProductRelation ($license - это сущность, переданная в форму, то есть объект значения запроса записываются, когда я звоню $form->bindRequest()). Вместо этого он возвращает массив массивов, внутренние массивы, содержащие имена и значения полей формы.

Это нормальное поведение или я допустил ошибку, которая каким-то образом мешает компоненту формы понять, что License#productRelations должен представлять собой массив объектов LicenseProductRelation?

Ответы [ 2 ]

5 голосов
/ 30 июля 2011

Поскольку ваша LicenseProductRelationType является встроенной формой для LicenseProductType, вы должны реализовать метод getDefaultOptions для LicenseProductRelationType и установить data_class в LicenseProductRelation (включая его пространство имен).

См. Документацию: http://symfony.com/doc/current/book/forms.html#creating-form-classes

и прокрутите вниз до раздела, озаглавленного «Установка data_class» - он указывает для встроенных форм, которые вам нужны для настройки метода getDefaultOptions.

Надеюсь, это поможет.

public function getDefaultOptions(array $options)
{
    return array(
        'data_class' => 'Acme\TaskBundle\Entity\Task',
    );
}
1 голос
/ 22 июля 2011

Вы должны использовать тип сущность . Эта функция включена в Doctrine и дает вам большую любовь / силу для управления коллекциями сущностей. Обязательно установите "multiple" => true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...