gpt4 book ai didi

php - Doctrine/Symfony2 中的 JMSSerializerBundle、SoftDeleteable 和多对多

转载 作者:行者123 更新时间:2023-12-04 18:08:43 25 4
gpt4 key购买 nike

我在一个有大量交叉引用数据的系统中使用 Gedmo Doctrine 扩展和 SoftDeleteable 扩展。我遇到了如下情况:

  1. 产品 A 分配给供应商 B
  2. 供应商 B 被[软]删除
  3. 产品 A 现在在序列化时抛出“实体不存在”,因为“供应商”外键仍然具有 供应商 B 的 ID,即使实体是软的已删除且无法提取。

需要注意的是,我不希望删除级联,也就是说我不想删除Product A只是因为Supplier B被删除了.当供应商记录被删除时,我只需要将供应商外键设置为 NULL(或被 JMS 解释为 NULL)。

这种情况很常见,我无法想象其他人不会遇到这种情况,但我找不到任何答案。有人有什么建议吗?

谢谢,-内特

最佳答案

对于相同的场景,我是这样做的:

抛出 EntityNotFoundException 的扩展 Doctrine 代理订阅者。要覆盖服务,只需添加参数:

jms_serializer.doctrine_proxy_subscriber.class: YourCustom\JMSDoctrineProxySubscriber

在你的自定义 DoctrineProxySubscriber 上

<?php

namespace YourCustom;

use Doctrine\ORM\EntityNotFoundException;
use JMS\Serializer\EventDispatcher\PreSerializeEvent;
use JMS\Serializer\EventDispatcher\Subscriber\DoctrineProxySubscriber;

class JMSDoctrineProxySubscriber extends DoctrineProxySubscriber
{
public function onPreSerialize(PreSerializeEvent $event)
{
try {
parent::onPreSerialize($event);
} catch (EntityNotFoundException $e) {
// The exception is thrown when soft-deleted objects are tried to be loaded.
// Soft-deleted Doctrine proxy objects should be treated as null. Overriding event type which is eventually
// a class name to stdClass would make it skip and result in as null.
$event->setType('stdClass');
}
}
}

关于php - Doctrine/Symfony2 中的 JMSSerializerBundle、SoftDeleteable 和多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19985865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com