Php Api平台DateTimeNormalizer不允许null

Php Api平台DateTimeNormalizer不允许null,php,symfony,api-platform.com,Php,Symfony,Api Platform.com,因为我更喜欢stackoverflow,而不是github,所以我把这个话题转移到这里 例如,您可能有一个具有deletedAt字段的用户。由于某些业务原因,用户被删除,但由于其他原因,您可能希望通过将deletedAt字段设置为null来重新激活他。如果您尝试使用API平台执行此操作,将出现以下错误: 如果数据为空字符串或null,则应传递可以使用传递的格式或有效的日期时间字符串进行分析的字符串 问题是,最好的处理方法是什么?以下是我如何处理的 I扩展API平台DateTimeNormaliz

因为我更喜欢stackoverflow,而不是github,所以我把这个话题转移到这里

例如,您可能有一个具有deletedAt字段的用户。由于某些业务原因,用户被删除,但由于其他原因,您可能希望通过将deletedAt字段设置为null来重新激活他。如果您尝试使用API平台执行此操作,将出现以下错误:

如果数据为空字符串或null,则应传递可以使用传递的格式或有效的日期时间字符串进行分析的字符串


问题是,最好的处理方法是什么?

以下是我如何处理的

I扩展API平台DateTimeNormalizer:

namespace App\Normalizer;

use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer as APIPlatformDateTimeNormalizer;

class DateTimeNormalizer extends APIPlatformDateTimeNormalizer
{
    public function denormalize($data, $type, $format = null, array $context = [])
    {
        if (null === $data) {
            return null;
        }

        return parent::denormalize($data, $type, $format, $context);
    }
}
并将其定义为与父规范化器同名的服务,父规范化器实际上覆盖了它api/config/services.yml:


我是这样处理的

I扩展API平台DateTimeNormalizer:

namespace App\Normalizer;

use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer as APIPlatformDateTimeNormalizer;

class DateTimeNormalizer extends APIPlatformDateTimeNormalizer
{
    public function denormalize($data, $type, $format = null, array $context = [])
    {
        if (null === $data) {
            return null;
        }

        return parent::denormalize($data, $type, $format, $context);
    }
}
并将其定义为与父规范化器同名的服务,父规范化器实际上覆盖了它api/config/services.yml:


这里有一个稍微调整过的版本,它严格地限制了自己对所提到的问题的关注

它不替换原始DateTimeNormalizer,而是以更高的优先级注册自身,并且仅处理传入的$data(如果它为空并且原始DateTimeNormalizer支持反规范化)

src/Normalizer/NullableDateTimeDenormalizer.php:

申报类型=1; 名称空间App\Normalizer; 使用Symfony\Component\Serializer\Normalizer\DenormalizerInterface; 最后一个类NullableDateTimeDenormalizer实现了DenormalizerInterface { 公共函数构造 私有非规范化接口$dateTimeNormalizer { } 公共函数反规范化$data,字符串$type,字符串$format=null,数组$context=[] { 返回null; } 公共函数支持规范化$data,字符串$type,字符串$format=null { 如果$data==| |$data===null{ 返回$this->dateTimeNormalizer->supportsDenormalization$data,$type,$format; } 返回false; } } config/services.yaml:

服务: App\Normalizer\NullableDateTimeDenormalizer: 论据: $dateTimeNormalizer:'@serializer.normalizer.datetime' 标签: - 名称:serializer.normalizer 优先权:100
这里有一个稍微调整过的版本,它严格地限制了自己对所提到的问题的关注

它不替换原始DateTimeNormalizer,而是以更高的优先级注册自身,并且仅处理传入的$data(如果它为空并且原始DateTimeNormalizer支持反规范化)

src/Normalizer/NullableDateTimeDenormalizer.php:

申报类型=1; 名称空间App\Normalizer; 使用Symfony\Component\Serializer\Normalizer\DenormalizerInterface; 最后一个类NullableDateTimeDenormalizer实现了DenormalizerInterface { 公共函数构造 私有非规范化接口$dateTimeNormalizer { } 公共函数反规范化$data,字符串$type,字符串$format=null,数组$context=[] { 返回null; } 公共函数支持规范化$data,字符串$type,字符串$format=null { 如果$data==| |$data===null{ 返回$this->dateTimeNormalizer->supportsDenormalization$data,$type,$format; } 返回false; } } config/services.yaml:

服务: App\Normalizer\NullableDateTimeDenormalizer: 论据: $dateTimeNormalizer:'@serializer.normalizer.datetime' 标签: - 名称:serializer.normalizer 优先权:100