Symfony 4: Обновление существующей сущности через десериализованную сущность заканчивается новым связанным элементом или исключением ORMInvalidArgumentException - PullRequest
1 голос
/ 07 марта 2019

Это мой первый вопрос здесь, на Stackoverflow.com, и прежде чем я напишу много.Сначала функция контроллера:

/**
 * @Rest\Patch("/identifiers/v2/{id}")
 *
 * @ParamConverter("identifier")
 * @ParamConverter("identifierPatch", converter="fos_rest.request_body")
 */
public function patchAction(Identifier $identifier, Identifier $identifierPatch)
{
    $identifier->setLandingPage($identifierPatch->getLandingPage());
    $identifier->setIdentifier($identifierPatch->getIdentifier());
    $identifier->setIsUsed($identifierPatch->getIsUsed());

    $this->entityManager->flush();

    /**
     * Just for debugging...
     */
    $view = $this->view([
        'identifier' => $identifier,
        'identifierPatch' => $identifierPatch
    ]);

    return $this->handleView($view);
}

Когда я пытаюсь ОБНОВИТЬ существующую сущность таким образом, я получаю ORMInvalidArgumentException с сообщением " Новая связь была найдена через связь (...)"

Когда я устанавливаю cascade={"persist"} для связанной сущности:

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\LandingPage", inversedBy="identifiers")
 * @ORM\JoinColumn(nullable=false)
 * @Assert\NotNull()
 * @Serializer\Type("App\Entity\LandingPage")
 */
private $landing_page;

... связанная сущность будет вставлена ​​как новая сущность, и это не то, чтоЯ ищу.

Я мог бы использовать $this->entityManager->merge($identifier), но это не то, что я ищу, а потому, что в будущем мне нужно будет выполнить некоторые ручные проверки и я хотел бы вернуть объект в качестве ответа (связанный объект будет нулевым, если он не обновлен), и $this->entityManager->merge() будет устаревшим в Доктрине 3.

Вопрос: Есть ли способ обновить данный объект десериализованным объектом?

Привет, Дэнни Эндерт


РЕДАКТИРОВАТЬ (1): Ну, я думаю, я нашел решение относительно этой "проблемы".

services.yaml

jms_serializer.object_constructor:
    alias: jms_serializer.doctrine_object_constructor
    public: false

Теперь я не получаю эксception и связанный объект не будут вставлены как новый объект.

...