Расширение FOSRestBundle Doctrine не работает по методу "PUT"

У меня есть проблема с FOSRestBundle и Doctrine Extensions. я использую Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundleреализовать доктринальные расширения.

Вот моя проблема: у меня есть сущность под названием "Статьи", в которой поле содержит некоторые расширения доктрины. В моем случае 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 с помощью этого метода контроллера:

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":"test@example.com",
        "email_canonical":"test@example.com",
        "enabled":true,
        },
    "last_edit_by":{
        "id":1,
        "username":"test",
        "username_canonical":"test",
        "email":"test@example.com",
        "email_canonical":"test@example.com",
        "enabled":true,
        },
    "created":"2014-01-14T15:44:43+0100",
    "updated":"2014-01-14T15:44:43+0100",
}

но если я попытаюсь изменить эту статью с помощью этого метода контроллера

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} 

мой объект стал

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

для полноты я добавлю специфичный для комплекта routing.yml:

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

и конф, который относится к моей проблеме:

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

Любая идея, в чем дело здесь?

2 ответа

Решение

Ура!!! Я решил!

Хорошо, ребята, для будущих ссылок я напишу здесь, в чем проблема: была в форме, которую я использовал.

Я создал форму с указанными атрибутами "доктрина расширена":

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')
    ;
}

Я надеюсь, что это может помочь кому-то быть таким же глупым, как я, и делать ту же ошибку:)

спасибо всем, кто потратил свое время, чтобы решить эту проблему!

С

Просто замените метод ввода оператора return следующим, это решит вашу проблему.

return $this->redirectView(
  $this->generateUrl(
    'get_article',
    array('id' => $entity->getId())
    ),
  Codes::HTTP_NO_CONTENT
);
Другие вопросы по тегам