2012-05-07 4 views
1

У меня есть форма (AbstractType), которая сопоставляется с сущностью (доктриной).Как сопоставить поле коллекции форм symfony2 с полем типа массива доктрины?

У этого объекта есть поле, которое имеет вид доктрины array.

В соответствии с документами symfony должно быть возможно сопоставить поле коллекции форм с array PHP, но, по-видимому, оно не работает, когда форма сопоставляется с сущностью. Symfony ожидает, что это поле будет отношением, но это всего лишь array.

Это не фактический код, просто пример:

Рассмотрим это (учение-сохранялось) сущность:

class Article 
{ 
    ... 
    /** 
    * @ORM\Column(type="array") 
    */ 
    protected $tags; 
    ... 
} 

И эта сущность (не удалось доктриной):

class Tag 
{ 
    ... 
    public $name; 
    ... 
} 

И этот вид формы:

class ArticleType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder->add('tags', 'collection', array('type' => new TagType())); 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'data_class' => '\Entity\Article', 
     ); 
    } 
} 

тега типа формы:

class TagType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder->add('name', 'text'); 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'data_class' => '\Entity\Tag', 
     ); 
    } 
} 

При попытке создать экземпляр доктрины СтатьяВид статьи пожалуется что-то вдоль линий:

Expected argument of type "\Entity\Tag", "array" given 

В файле:

поставщика/Symfony/SRC/Symfony/Компонент/Форма/Расширение/Ядро/DataMapper/PropertyPathMapper.php по строке 47

Действительно ли это можно сделать то, что я хочу, не написав свой собственный тип поля?

ОБНОВЛЕНИЕ: Может быть, я должен перефразировать мой вопрос: как мне сказать symfony не отображать это поле ни на что (если я изменю свое имя, symfony жалуется, что у объекта нет такого свойства)?

ответ

2

Я пропустил одну вещь. У меня были загруженные приборы, которые содержали массив ассоциативных массивов в свойстве collection (tags здесь). Я забыл перезагрузить светильники после их изменения в массив сущностей (массив из Tag экземпляров здесь).

Теперь все работает безупречно, поэтому inid symfony может отображать коллекцию форм как на array, так и на отношения (ArrayCollection). Разница в том, что мне не нужно вручную сохранять обратную сторону отношения.

Так что это было мое плохо. Спасибо, в любом случае.

0

Ну как array тип в конечном итоге преобразуется в сериализованную строку, сопоставление его с типом коллекции является неуместным. Лучшим способом должно быть создание настраиваемого типа поля, где getParent является «текстом» и добавляет преобразователь данных, который преобразует вход пользователя в массив или наоборот. Проверьте this запись поваренной книги.

+0

Это не жизнеспособное решение для меня. Приведенный выше код является лишь примером. В действительности каждая подчиненность немного сложнее, чем одно текстовое поле. – pinkeen

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