首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在symfony中禁用软删除(软删除)过滤器

如何在symfony中禁用软删除(软删除)过滤器
EN

Stack Overflow用户
提问于 2016-07-05 08:13:22
回答 4查看 19.2K关注 0票数 14

为Doctrine 2安装和使用SoftDeleteable行为扩展非常容易。问题通常是试图对某些代码部分禁用它,然后再次启用。您可能需要这样做:

  1. 加载被软删除的实体
  2. 完全绕过软删除过滤器从数据库中删除实体

那么如何禁用它呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-05 08:13:22

1.如何加载软删除实体

根据文档,禁用实体管理器筛选器:

代码语言:javascript
复制
$em->getFilters()->disable('softdeleteable');
$object = $em->find('AppBundle:Object', 1); // soft-deleted entity will be loaded

若要启用软删除,请再次删除:

代码语言:javascript
复制
$em->getFilters()->enable('softdeleteable');

注意:如果实体已经加载了禁用的软删除筛选器,则这行之前可能需要$em->clear();

2.如何从数据库中完全删除实体

即使文档中没有提到第一个解决方案,如果您需要删除实体并绕过软删除筛选器,则第一个解决方案不起作用。需要从实体管理器的事件侦听器中删除筛选器:

代码语言:javascript
复制
// initiate an array for the removed listeners
$originalEventListeners = [];

// cycle through all registered event listeners
foreach ($em->getEventManager()->getListeners() as $eventName => $listeners) {
    foreach ($listeners as $listener) {
        if ($listener instanceof \Gedmo\SoftDeleteable\SoftDeleteableListener) {

            // store the event listener, that gets removed
            $originalEventListeners[$eventName] = $listener;

            // remove the SoftDeletableSubscriber event listener
            $em->getEventManager()->removeEventListener($eventName, $listener);
        }
    }
}

// remove the entity
$em->remove($object);
$em->flush($object); // or $em->flush();

// re-add the removed listener back to the event-manager
foreach ($originalEventListeners as $eventName => $listener) {
    $em->getEventManager()->addEventListener($eventName, $listener);
}

参考文献:

票数 32
EN

Stack Overflow用户

发布于 2018-05-11 09:56:11

可以使用服务禁用和重新启用软删除筛选器行为:

代码语言:javascript
复制
<?php

namespace App\Util;

use Doctrine\ORM\EntityManagerInterface;
use Gedmo\SoftDeleteable\SoftDeleteableListener;

class SoftDeleteFilter
{
    /**
     * @var string
     */
    const EVENT_NAME = 'onFlush';

    /**
     * @var object
     */
    private $originalEventListener;

    /**
     * @param EntityManagerInterface $em
     */
    public function removeSoftDeleteFilter(EntityManagerInterface $em)
    {
        foreach ($em->getEventManager()->getListeners() as $eventName => $listeners) {
            foreach ($listeners as $listener) {
                if ($listener instanceof SoftDeleteableListener) {
                    if ($eventName === self::EVENT_NAME) {
                        $this->originalEventListener = $listener;
                        $em->getEventManager()->removeEventListener($eventName, $listener);
                    }
                }
            }
        }
    }

    /**
     * @param EntityManagerInterface $em
     */
    public function undoRemoveSoftDeleteFilter(EntityManagerInterface $em)
    {
        if (empty($this->originalEventListener)) {
            throw new \Exception('can not undo remove, soft delete listener was not removed');
        }
        // re-add the removed listener back to the event-manager
        $em->getEventManager()->addEventListener(self::EVENT_NAME, $this->originalEventListener);
    }
}

用法:

代码语言:javascript
复制
$this->softDeleteFilter->removeSoftDeleteFilter($this->entityManager);
$this->entityManager->remove($entity);
$this->entityManager->flush();
$this->softDeleteFilter->undoRemoveSoftDeleteFilter($this->entityManager);
票数 3
EN

Stack Overflow用户

发布于 2020-03-21 15:46:37

只是个小小的提醒。

当您想要使用Gedmo硬删除实体时,必须在相应的注释中包含hardDelete=true,请参见:

@Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false, hardDelete=true)

编辑:默认情况下,hardDelete=true为真

这样,您就不必禁用侦听器/筛选器。如果您有hardDelete=false,上面建议的双移除将无法工作。

来源:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38198357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档