php - 如何修复 Symfony 中的“已有数据”错误
问题描述
我想在序列化后添加交货日期
所以我用“onPostSerialize”方法创建了一个事件监听器。
这是我的听众:
namespace App\ApiBundle\Serializer\Listener;
use JMS\Serializer\EventDispatcher\Events;
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
use JMS\Serializer\EventDispatcher\ObjectEvent;
class BrandListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
[
'event' => Events::POST_SERIALIZE,
'format' => 'json',
'class' => 'App\ApiBundle\Entity\Brand',
'method' => 'onPostSerialize',
]
];
}
public static function onPostSerialize(ObjectEvent $event)
{
$object = $event->getObject();
$date = new \Datetime();
$event->getVisitor()->addData('delivered_at', $date->format('l jS \of F Y h:i:s A'));
}
}
即使清空缓存,我也有一个错误,告诉我数据具有相同的名称(除了没有)...
这里的错误 Symfony:
InvalidArgumentException 已经有“delivered_at”的数据
.
解决方案
public function onPostSerialize(ObjectEvent $event): void
{
$propertyName = 'deliveredAt';
$value = (new \DateTime())->format('l jS \of F Y h:i:s A');
$className = Brand::class;
/** @var JsonSerializationVisitor $visitor */
$visitor = $event->getVisitor();
$metadata = new VirtualPropertyMetadata($className, $propertyName);
// check if property is displayed
if ($visitor->hasData($metadata->name)) {
$visitor->visitProperty(
new StaticPropertyMetadata($className, $metadata->name, $value),
$value
);
}
}
但您也可以使用另一种方式:在品牌实体中添加虚拟属性
/**
* @JMS\VirtualProperty({name: "delivered_at"})
*/
public function getDeliveredAt()
{
return (new \DateTime())->format('l jS \of F Y h:i:s A');
}
推荐阅读
- python - 使用特定的数据框单元格值创建合并的新数据框
- python - 如果在字符串中找不到字符,为什么返回 -1?
- css - 某人管理员 2 引导登录图像卡住
- typescript - 使用 raw-loader 和 TypeScript 时“找不到模块”
- python - 即使列包含字符串,如何转换为日期时间
- java - Android Studio - findViewById() 导致错误
- sql - 转换UTC?选择时区到 Oracle 中的 EST
- node.js - 使用 writestream 频繁写入大量流数据
- html - 在移动设备上以不同方式定位表格元素
- python - 附加数据帧时修复索引