2015-12-03 2 views
0

Я пытаюсь сделать RESTful API, и когда я обрабатываю PUT, он всегда отвечал мнеEntity формы типа в Symfony2

{ 
    "code": 500, 
    "message": "The form's view data is expected to be an instance of class My\\Bundle\\Entity\\Post, but is a(n) array. You can avoid this error by setting the \"data_class\" option to null or by adding a view transformer that transforms a(n) array to an instance of My\\Bundle\\Entity\\Post." 
} 

Вот как я пишу PUT действие.

public function putPostAction($postKey, Request $request){ 
    $post = $this->getDoctrine()->getManager()->getRepository('MyBundle:Post') 
     ->findPost($postKey); 
    $form = $form = $this->createFormBuilder($post, 
     array('data_class' => 'My\Bundle\Entity\Post'))->getForm(); 
    // or use createForm like 
    // $form = $this->createForm(new PostType(), $post); 
    $form->submit($request); 
    if($form->isValid()){ 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($post); 
     $em->flush(); 
     return $post; 
    } 
    return array(
     "form" => $form 
    ); 
} 

Говоря тип сущности, это выглядит как

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('cityKey') 
      ->add('status') 
      ->add('text') 
      ->add('imageKey') 
      ->add('createTime') 
      ->add('updateTime') 
     ; 
    } 
/** 
* @param OptionsResolverInterface $resolver 
*/ 
public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'My\Bundle\Entity\Post', 
     'csrf_protection' => false 
    )); 
} 

/** 
* @return string 
*/ 
public function getName() 
{ 
    return ''; 
} 

Что касается сообщений об ошибке, я изменил Резольвер

public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => null, 
      'csrf_protection' => false 
     )); 
    } 

На этот раз я получил другую ошибку,

{ 
    "code": 500, 
    "message": "EntityManager#persist() expects parameter 1 to be an entity object, array given." 
} 

Любая идея? Заранее спасибо.

+0

функция «» findPost возвращает массив объектов не один объект. Вместо этого вы должны вызвать 'find ($ id)', который возвращает только один объект post. –

+1

@ ТурдалиевНурсултан ДА ЭТО РАБОТАЕТ! причина, по которой я пишу 'findPost ($ postKey)', - это условие select включает 'postKey' &' enabled', поскольку для преобразования массива в объект требуется трансформатор данных, альтернативно через 'find ($ postKey)' to сначала получите объект, затем используйте '$ post-> getEnabled()' для определения следующего шага. Сохраните большую часть моего времени! Спасибо друг. – Sarotti

+0

Перемещенный комментарий к ответу, чтобы люди знали, что этот вопрос уже ответил и принят. Обычно трудно понять, была ли проблема решена или нет. Не все читают комментарии. –

ответ

0

findPost Функция возвращает массив объектов, а не object. Вместо этого вы должны позвонить find($id), который возвращает только один объект Post.

Так оно и должно быть:

$post = $this->getDoctrine()->getManager() 
      ->getRepository('MyBundle:Post') 
      ->find($postKey); 
Смежные вопросы