2014-01-16 4 views
0

FOSRestBundle 및 Doctrine Extension에 문제가 있습니다. Doctrine Extension을 구현하는 데 Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle을 사용합니다.FOSRestBundle "PUT"메서드에서 Doctrine 확장이 작동하지 않습니다.

여기 내 문제 : 일부 교리 확장에 의해 피드 된 일부 필드가있는 "기사"라는 엔터티가 있습니다. 내 경우 Timestampable 및 Blameable.

class Articles { 

/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
* @var integer 
*/ 
private $id; 

/** 
* @var string 
* @ORM\Column(type="text") 
*/ 
private $description; 

/** 
* @Gedmo\Blameable(on="create") 
* @ORM\ManyToOne(targetEntity="\Zanzibar\UsersBundle\Entity\Users") 
* @ORM\JoinColumn(name="createdBy", referencedColumnName="id") 
*/ 
protected $createdBy; 

/** 
* @Gedmo\Blameable(on="update") 
* @ORM\ManyToOne(targetEntity="\Zanzibar\UsersBundle\Entity\Users") 
* @ORM\JoinColumn(name="lastEditBy", referencedColumnName="id") 
* 
* @var Users 
*/ 
private $lastEditBy; 

/** 
* @var datetime $created 
* 
* @Gedmo\Timestampable(on="create") 
* @ORM\Column(type="datetime") 
*/ 
private $created; 

/** 
* @var datetime $updated 
* 
* @Gedmo\Timestampable(on="update") 
* @ORM\Column(type="datetime") 
*/ 
private $updated; 

나는이 컨트롤러 메소드로 REST를 통해 새로운 제품을 만드는 succesfull 해요 :

public function postArticleAction(Request $request) 
{ 
    $entity = new Articles(); 
    $form = $this->createForm(new ArticlesType(), $entity); 
    $form->submit($request); 

    if ($form->isValid()) { 
     $entity = $form->getData(); 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($entity); 
     $em->flush(); 

     return $this->redirectView(
      $this->generateUrl(
       'get_article', 
       array('id' => $entity->getId()) 
      ), 
      Codes::HTTP_CREATED 
     ); 
    } 

    return array(
     'form' => $form, 
    ); 
} //[POST {"description":"a_description"}] /articles 

내가 그것을하지 않고 작업을 수행

{ 
    "description":"test_Article14_", 
} 

뭔가를 게시 새로운 개체를 만들 때 문제, 나에게 같은 대상을주는 것

{ 
    "id":14, 
    "description":"test_Article14", 
    "created_by":{ 
     "id":1, 
     "username":"test", 
     "username_canonical":"test", 
     "email":"[email protected]", 
     "email_canonical":"[email protected]", 
     "enabled":true, 
     }, 
    "last_edit_by":{ 
     "id":1, 
     "username":"test", 
     "username_canonical":"test", 
     "email":"[email protected]", 
     "email_canonical":"[email protected]", 
     "enabled":true, 
     }, 
    "created":"2014-01-14T15:44:43+0100", 
    "updated":"2014-01-14T15:44:43+0100", 
} 
,451,515,

하지만이 컨트롤러 방법이 조항을 수정하려고하면

public function putArticlesAction(Request $request, $id) 
{ 
    $entity = $this->getEntity($id); 
    $form = $this->createForm(new ArticlesType(), $entity); 
    $form->submit($request); 

    if ($form->isValid()) { 
     $entity = $form->getData(); 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($entity); 
     $em->flush(); 

     return $this->redirectView(
      $this->generateUrl(
       'get_article', 
       array('id' => $entity->getId()) 
      ), 
      Codes::HTTP_CREATED 
     ); 
    } 

    return array(
     'form' => $form, 
    ); 
} //[PUT {"description":"a_description"}] /articles/{id} 

내 객체가 난 번들 특정 routing.yml 추가 할 것 완성도

{ 
    "id":14, 
    "description":"test_Article14_", 
    "created":"-0001-11-30T00:00:00+0100", 
    "updated":"-0001-11-30T00:00:00+0100", 
} 

:

articles: 
type: rest 
resource: Zanzibar\BackendBundle\Controller\ArticlesController 

및 내 문제를 참조하는 conf :

fos_rest: 
param_fetcher_listener: true 
body_listener: true 
format_listener: true 
view: 
    view_response_listener: 'force' 
routing_loader: 
    default_format: json 
stof_doctrine_extensions: 
default_locale: en_US 
orm: 
    default: 
     blameable: true 
     timestampable: true 

어떤 문제가 발생했는지에 대한 아이디어가 있습니까?

답변

1

예! 해결되었습니다!

추후에 참조 할 내용은 다음과 같습니다. 은 내가 사용했던 형태입니다. 그들은 자동으로 채워으로이 거기에 가지 말았어야 물론

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('description') 
     ->add('created') 
     ->add('updated') 
     ->add('createdBy') 
     ->add('lastEditBy') 
    ; 
} 

가 : 그래서 올바른 버전

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('description') 
    ; 
} 
입니다

나는 속성이 지정된 "확장 교리"를 함께 양식을 작성

나는 이것이 내 바보처럼되고 내 같은 오류를하는 데 도움이되기를 바란다 :)

그들의 모든 시간을 해결해 주셔서 감사합니다. 이!

0

return 문 입력 방법을 다음과 같이 바꾸면 문제가 해결됩니다.

return $this->redirectView(
    $this->generateUrl(
    'get_article', 
    array('id' => $entity->getId()) 
    ), 
    Codes::HTTP_NO_CONTENT 
); 
+0

안녕 Dipesh 및 도움에 감사드립니다. 불행히도 그것은 이렇게 좋았지 만, 내 테스트를하면서 그것을 바꿨습니다. Anycase가 작동하지 않아 이전 버전으로 되돌아 가지 않습니다. ( 건배, C – rollsappletree

관련 문제