使用 NormalizerAwareTrait 的 Normalizer 空引用

Normalizer null reference using NormalizerAwareTrait

我有两个 objectsParent-Child 关系。对于每个 object 我有一个自定义 normalizer 如下所示:

ChildNormalizer.php

use Symfony\Component\Serializer\Normalizer\scalar;

class ChildNormalizer
{  
    public function normalize($object, $format = null, array $context = array())
    {
      return [
        "name" => $object->getName(),
        "age" => $object->getAge(),
        ...
        ];
    }

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

ParentNormalizer.php

use Symfony\Component\Serializer\Encoder\NormalizationAwareInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Serializer\Normalizer\scalar;

class ParentNormalizer implements NormalizerInterface, NormalizationAwareInterface
{
    use NormalizerAwareTrait;

    public function normalize($object, $format = null, array $context = array())
    {
      return [
        ...
        "children" => array_map(
            function ($child) use ($format, $context) {
                return $this->normalizer->normalize($child);
            }, $object->getChildren()
          ),
        ...
        ];
    }

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

当我尝试序列化 Parent object 进而规范化 Child object 时,出现以下异常:

Call to a member function normalize() on null

我是不是错过了一个配置步骤,或者我到底做错了什么?

问题解决了,我执行错了*AwareInterface

如果 ParentNormalizer 实现的是 NormalizerAwareInterface 而不是 NormalizationAwareInterface

,则代码可以完美运行
use Symfony\Component\Serializer\Encoder\NormalizerAwareInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Serializer\Normalizer\scalar;

class ParentNormalizer implements NormalizerInterface, NormalizerAwareInterface
{
    ...
}