symfony fosrestbundle — Как опубликовать запись со связанными сущностями (многие ко многим)

Я пытаюсь создать RESTful API с Symfony2, FosRestBundle и JMSSerializer, и все работает идеально, пока я не попытаюсь сохранить объект с какой-либо ассоциацией. Это работает «из коробки» со стандартной версией symfony, достаточно установить поле формы как «сущность», и фреймворк обновит кросс-таблицу. Однако, когда я пытаюсь сделать то же самое в настройке REST, я получаю эту ошибку «Уведомление: преобразование массива в строку», связанную с полем формы «категории», и ошибку 500.

Как я должен сохранять связанные объекты с помощью API?

Сущность Serie.php

/**
 * @ORM\ManyToMany(targetEntity="Category", inversedBy="series")
 * @ORM\JoinTable(name="categories_series")
 */
private $categories;

форма SerieType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('categories', 'entity', array(
            'multiple' => true,
            'expanded' => false,
            'property' => 'name',
            'class' => 'My\Bundle\CoreBundle\Entity\Category'
        ))
        ->add('name')
        ->add('description')
        ->add('status', 'checkbox', array('required' => false))
        ->add('save', 'submit')
    ;
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'My\Bundle\CoreBundle\Entity\Serie',
        'csrf_protection'   => false
    ));
}

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

и SerieController.php

/**
 * @POST("", name="serie_new")
 */
public function newAction(Request $request){

    $serie = new Serie();

    $form = $this->createForm(new SerieType(), $serie);
    $form->submit($request->request->get($form->getName()));

    if($form->isValid()){
        $em = $this->getDoctrine()->getManager();

        $em->persist($serie);
        $em->flush();

        $view = $this->routeRedirectView('serie_index');
        return $this->handleView($view);
    }

и JSON POST-запрос:

{ 
"serie": {
    "categories":[
        {"id":1,"name":"Category 1"},
        {"id":2,"name":"Category 2"}
        ],
    "name":"asasdasd",
    "description":"sadsads",
    "status":true
}

person Carlo    schedule 11.02.2015    source источник


Ответы (1)


Ваша ошибка, вероятно, генерируется при попытке отобразить сущность. Попробуйте добавить метод __toString() к вашей категории.

И вы должны использовать DataTransformer, чтобы иметь возможность идентифицировать категорию при попытке отправить запрос POST.

person Stev    schedule 12.02.2015
comment
Я думал, что DataTransformer решит эту проблему, интересно, существует ли какой-либо способ сделать эту работу из коробки, например, для обычной формы и запроса обработки. - person Carlo; 12.02.2015
comment
DataTransformer используется при рендеринге или отправке формы, а не при рендеринге контента в ответе json. - person Stev; 17.02.2015