Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony3-序列化嵌套实体_Symfony_Doctrine - Fatal编程技术网

Symfony3-序列化嵌套实体

Symfony3-序列化嵌套实体,symfony,doctrine,Symfony,Doctrine,所以我有两个实体,一个订阅和一个订户。单个订户(多个)有多个订阅。我为这两个实体都编写了自定义规范化器,但一旦订阅服务器被规范化为JSON,就很难让它在订阅中显示 我能够让它工作的唯一方法是将“订户”规范化器传递给“订阅”规范化器。似乎我应该能够使用SerializerAwareNormalizer特性,或者类似的东西,让Symfony递归地规范化我的相关实体 services: acme.marketing.api.normalizer.subscription: class: acm

所以我有两个实体,一个订阅和一个订户。单个订户(多个)有多个订阅。我为这两个实体都编写了自定义规范化器,但一旦订阅服务器被规范化为JSON,就很难让它在订阅中显示

我能够让它工作的唯一方法是将“订户”规范化器传递给“订阅”规范化器。似乎我应该能够使用SerializerAwareNormalizer特性,或者类似的东西,让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 }
<?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;
    }

}
和标准化器

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

}

在谷歌上花了几个小时,却无法理解。在5分钟后发布,点击正确的google链接:(。答案似乎是在自定义规范化器上实现NormalizerAwareInterface,然后使用NormalizerAwareTrait访问嵌套实体的规范化器

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

}