首页 > 解决方案 > 如何修复 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”的数据

.

标签: phpsymfonyjms

解决方案


 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');
}

推荐阅读