Как сообщить EntityManager о сущности?

Всем привет.
У меня есть сущность Comment, которая заполняется данными из массива через symfony/serializer, а эти данные соответственно приходят с формы. Да, на проекте нет symfony, проект старый, перевожу на компоненты.

У сущности есть $id, который является первичным ключом. Соответственно при редактировании комментария вызывается ее метод setId:
$serializer->denormalize($request->request->all(), Comment::class);


Но EM ничего не знает об этой сущности и при persist()/flush() он создает новую сущность, игнорируя идентификатор. Как сделать так, чтобы данные заполнялись из serializer и при этом доктрина не игнорировала $id?
  • Вопрос задан
  • 221 просмотр
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
https://symfony.com/doc/current/components/seriali...

Это можно обернуть в какой-нибудь кастомный нормалайзер
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;

class MyObjectDenormalizer implements DenormalizerInterface
{
    private ObjectNormalizer $objectNormalizer;
    private EntityManagerInterface $entityManager;

    public function __construct(ObjectNormalizer $objectNormalizer, EntityManagerInterface $entityManager)
    {
        $this->objectNormalizer = $objectNormalizer;
        $this->entityManager = $entityManager;
    }

    public function denormalize($data, string $type, string $format = null, array $context = [])
    {
        if ($id = $data['id'] ?? null) {
            $object = $this->entityManager->getRepository($type)->find($id);
            $context = [
                AbstractObjectNormalizer::OBJECT_TO_POPULATE => $object,
            ];
            unset($data['id']);
        }

        return $this->objectNormalizer->denormalize($data, $type, $format, $context);
    }

    public function supportsDenormalization($data, string $type, string $format = null)
    {
        return $this->objectNormalizer->supportsDenormalization($data, $type, $format);
    }
}


Но лучше подставлять объект в контроллере на основании данных из роута (/comment/{id}/edit), т.к. есть возможность подменить id и отредактировать другую сущность (к которой, к примеру, у пользователя доступа нет)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы