【问题标题】:Api Platform DateTimeNormalizer not allowing nullApi Platform DateTimeNormalizer 不允许 null
【发布时间】:2021-03-10 22:26:22
【问题描述】:

因为我更喜欢 stackoverflow 而不是 github,所以我将这个 issue 对话移到这里。

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

The data is either an empty string or null, you should pass a string that can be parsed with the passed format or a valid DateTime string.

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

【问题讨论】:

    标签: php symfony api-platform.com


    【解决方案1】:

    这是我的处理方式。

    我扩展了 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):

    services:
        serializer.normalizer.datetime:
                class: App\Normalizer\DateTimeNormalizer
                tags:
                    - { name: serializer.normalizer }
    

    【讨论】:

      【解决方案2】:

      这是一个稍微调整的版本,它严格限制在提到的问题上。

      它不会替换原来的DateTimeNormalizer,而是用更高的优先级注册自己,并且只处理传入的$data,如果它是空的并且原来的DateTimeNormalizer支持非规范化。

      src/Normalizer/NullableDateTimeDenormalizer.php:

      declare(strict_types=1);
      
      namespace App\Normalizer;
      
      use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
      
      final class NullableDateTimeDenormalizer implements DenormalizerInterface
      {
          public function __construct(
              private DenormalizerInterface $dateTimeNormalizer
          ) {
          }
      
          public function denormalize($data, string $type, string $format = null, array $context = [])
          {
              return null;
          }
      
          public function supportsDenormalization($data, string $type, string $format = null)
          {
              if ($data === '' || $data === null) {
                  return $this->dateTimeNormalizer->supportsDenormalization($data, $type, $format);
              }
      
              return false;
          }
      }
      

      config/services.yaml:

      services:
          App\Normalizer\NullableDateTimeDenormalizer:
              arguments:
                  $dateTimeNormalizer: '@serializer.normalizer.datetime'
              tags:
                  -
                      name: serializer.normalizer
                      priority: 100
      

      【讨论】:

        猜你喜欢
        • 2018-06-25
        • 1970-01-01
        • 2020-11-03
        • 2010-12-18
        • 1970-01-01
        • 1970-01-01
        • 2020-11-14
        • 2017-10-17
        • 2012-06-07
        相关资源
        最近更新 更多