Symfony3 - 序列化嵌套实体

Don*_*d P 2 doctrine symfony

所以我有几个学说实体,一个订阅和一个订阅者.单个订户有许多订阅(manyToOne).我为两个实体编写了自定义规范化程序,但是一旦将规范化规范化为JSON,就很难让订阅服务器显示在订阅服务器中.

我能够让它工作的唯一方法是将"Subscriber"规范化器传递给"Subscription"规范器.看起来我应该能够使用SerializerAwareNormalizer Trait或类似的东西来让Symfony递归地规范化我的相关实体.

services:
acme.marketing.api.normalizer.subscription:
    class: acme\MarketingBundle\Normalizer\SubscriptionNormalizer
    arguments: ['@acme.marketing.api.normalizer.subscriber']
    public: false
    tags:
        - { name: serializer.normalizer }
acme.marketing.api.normalizer.subscriber:
    class: acme\MarketingBundle\Normalizer\SubscriberNormalizer
    public: false
    tags:
        - { name: serializer.normalizer }
Run Code Online (Sandbox Code Playgroud)

和规范化器......

<?php
namespace acme\MarketingBundle\Normalizer;

use acme\MarketingBundle\Entity\Subscription;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;

class SubscriptionNormalizer implements NormalizerInterface
{


    private $subscriberNormalizer;

    public function __construct($subscriberNormalizer)
    {
        $this->subscriberNormalizer = $subscriberNormalizer;
    }

    public function normalize($subscription, $format = null, array $context = [])
    {

        /* @var $subscription Subscription */
        $subscriber = $subscription->getSubscriber();

        return [
            "id" => $subscription->getId(),
            "subscriber" => $this->subscriberNormalizer->normalize($subscriber, $format)
        ];
    }



    public function supportsNormalization($data, $format = null)
    {
        return $data instanceof Subscription;
    }

}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现这一目标?

Don*_*d P 9

在谷歌上花了几个小时,无法搞清楚.发布在SO和5分钟后点击右侧谷歌链接:(.答案似乎是在自定义规范化器上实现NormalizerAwareInterface,然后使用NormalizerAwareTrait来访问嵌套实体的规范化器.

<?php
namespace acme\MarketingBundle\Normalizer;

use acme\MarketingBundle\Entity\Subscription;
use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;

class SubscriptionNormalizer implements NormalizerInterface, NormalizerAwareInterface
{

    use NormalizerAwareTrait;

    public function normalize($subscription, $format = null, array $context = [])
    {

        return [
            "id" => $subscription->getId(),
            "subscriber" => $this->normalizer->normalize($subscription->getSubscriber())
        ];
    }



    public function supportsNormalization($data, $format = null)
    {
        return $data instanceof Subscription;
    }

}
Run Code Online (Sandbox Code Playgroud)