【问题标题】:Return only Id of child entity with symfony serializer使用 symfony 序列化程序仅返回子实体的 ID
【发布时间】:2019-08-01 08:47:50
【问题描述】:

我在我的项目中使用 symfony/serializer,并希望返回子实体的唯一 ID。例如我有订单和用户这两个实体。 当我获取订单并返回结果时,我只想要用户的 ID。我已经设法通过使用@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;
    }

}

【问题讨论】:

  • 如果你使用 JMSSerializerBundle 你可以检查虚拟属性

标签: symfony doctrine serialization


【解决方案1】:

您可以在不指定任何组的情况下序列化所有实体

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

如果你想序列化一个孩子,你必须按照你说的去做。在每个属性中设置要返回的组。

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

【讨论】:

    【解决方案2】:

    我创建了一个自定义规范器来执行此操作。不确定这是否是完美的解决方案,但对我有用。我发现为所有实体编写组太麻烦了。

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

    【讨论】:

    猜你喜欢
    • 2015-11-07
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多