【问题标题】: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