Возврат только идентификатора дочерней сущности с сериализатором symfony - PullRequest
1 голос
/ 11 марта 2019

Я использую symfony / serializer в своем проекте и хотел бы вернуть единственный идентификатор дочерней сущности. например У меня есть эти две сущности Order и User. Когда я получаю заказы и возвращаю результат, мне нужен только идентификатор пользователя. Мне удалось сделать это с помощью @Groups, но добавление группы к каждому свойству в классе требует большой работы, если у меня есть другой запрос, требующий всех подробностей.

/**
 * Order
 *
 * @ORM\Table(name="orders")
 * @ORM\Entity
 */
class Order
{
    /**
     * @var int
     *
     * @ORM\Column(name="Id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var Users
     * @ORM\ManyToOne(targetEntity="Users")
     * @ORM\JoinColumn(name="UID", referencedColumnName="UID", nullable=false)
     */
    private $user;

    /**
     * @return int
     */
    public function getId(): int
    {
        return $this->id;
    }

    /**
     * @return Users
     */
    public function getUser(): Users
    {
        return $this->user;
    }

    /**
     * @param Users $user
     * @return Order
     */
    public function setUser(Users $user): Order
    {
        $this->user = $user;
        return $this;
    }

}


/**
 * Users
 *
 * @ORM\Table(name="users")
 * @ORM\Entity
 */
class Users
{
    /**
     * @var int
     *
     * @ORM\Column(name="UID", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $UID;

    /**
     * @var string
     *
     * @ORM\Column(name="FirstName", type="encrypted", length=255, nullable=false)
     */
    private $FirstName;

    public function getUID(): ?int
    {
        return $this->UID;
    }

    public function getFirstName(): ?string
    {
        return $this->FirstName;
    }

    public function setFirstName(string $FirstName): self
    {
        $this->FirstName = $FirstName;

        return $this;
    }

}

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Я создал собственный нормализатор, который делает это. Не уверен, что это идеальное решение, но работает для меня. Я нашел написание групп для всех сущностей слишком много хлопот.

use Doctrine\Common\Annotations\AnnotationException;
use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\ORM\Mapping\Entity;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;

class EntityNormalizer implements NormalizerInterface
{
    const ID_ONLY_ATTRIBUTES = 'ignored_attributes';

    private $normalizer;

    /**
     * IdOnlyNormalizer constructor.
     * @param ObjectNormalizer $normalizer
     */
    public function __construct(ObjectNormalizer $normalizer)
    {
        $this->normalizer = $normalizer;
    }

    public function normalize($object, $format = null, array $context = [])
    {
        if (
            $context[self::ID_ONLY_ATTRIBUTES]
            && (in_array(get_class($object), $context[self::ID_ONLY_ATTRIBUTES]))
        ) {
            $data = $object->getId();
        } else {
            $data = $this->normalizer->normalize($object, $format, $context);
        }

        return $data;
    }

    public function supportsNormalization($data, $format = null)
    {
        $supports = false;
        if (!is_array($data)) {
            try {
                $reflectionClass = new \ReflectionClass($data);
                $reader = new AnnotationReader();
                $annotation = $reader->getClassAnnotation($reflectionClass, Entity::class);
                $supports = !is_null($annotation);
            } catch (AnnotationException $e) {

            } catch (\ReflectionException $e) {

            }
        }
        return $supports;
    }
}
0 голосов
/ 11 марта 2019

Вы можете сериализовать все сущности без указания какой-либо группы

$serializer->serialize($order, 'json');

Если вы хотите сериализовать ребенка, вы должны делать то, что говорите. Установите группы в каждом свойстве, что вы хотите вернуть.

$serializer->serialize(
    $order,
    'json', ['groups' => 'order-user']
);
...