doctrine/mongodb-odm-softdelete

此包已被废弃且不再维护。没有建议的替代包。

Doctrine MongoDB MongoDB SoftDelete 库

dev-master 2014-05-14 18:56 UTC

This package is not auto-updated.

Last update: 2021-03-05 20:32:36 UTC


README

此库为您提供了管理 Doctrine MongoDB ODM 文档软删除状态的额外类和 API。要开始使用,只需配置几个对象并获取 SoftDeleteManager 实例即可。

配置

use Doctrine\ODM\MongoDB\SoftDelete\Configuration;
use Doctrine\ODM\MongoDB\SoftDelete\UnitOfWork;
use Doctrine\ODM\MongoDB\SoftDelete\SoftDeleteManager;
use Doctrine\Common\EventManager;

// $dm is a DocumentManager instance we should already have

$config = new Configuration();
$evm = new EventManager();
$sdm = new SoftDeleteManager($dm, $config, $evm);

软删除文档

为了使文档能够使用软删除功能,它们必须实现 SoftDeleteable 接口

interface SoftDeleteable
{
    function getDeletedAt();
}

实现可能如下所示

use Doctrine\ODM\MongoDB\SoftDelete\SoftDeleteable;

/** @mongodb:Document */
class User implements SoftDeleteable
{
    // ...

    /** @mongodb:Date */
    private $deletedAt;

    public function getDeletedAt()
    {
        return $this->deletedAt;
    }

    // ...
}

管理软删除状态

一旦您拥有 $sdm,您就可以开始管理文档的软删除状态

$jwage = $dm->getRepository('User')->findOneByUsername('jwage');
$fabpot = $dm->getRepository('User')->findOneByUsername('fabpot');
$sdm->delete($jwage);
$sdm->delete($fabpot);
$sdm->flush();

上述操作将发出一个简单查询,设置删除日期

db.users.update({ _id : { $in : userIds }}, { $set : { deletedAt : new Date() } })

现在如果我们恢复文档

$sdm->restore($jwage);
$sdm->flush();

将取消设置 deletedAt 日期

db.users.update({ _id : { $in : userIds }}, { $unset : { deletedAt : true } })

事件

当文档软删除或恢复时,我们会触发一些额外的生命周期事件

  • Events::preSoftDelete
  • Events::postSoftDelete
  • Events::preRestore
  • Events::postRestore

使用事件非常简单,只需定义一个类,如下所示

class TestEventSubscriber implements \Doctrine\Common\EventSubscriber
{
    public function preSoftDelete(LifecycleEventArgs $args)
    {
        $document = $args->getDocument();
        $sdm = $args->getSoftDeleteManager();
    }

    public function getSubscribedEvents()
    {
        return array(Events::preSoftDelete);
    }
}

现在我们只需将事件订阅者添加到事件管理器中

$eventSubscriber = new TestEventSubscriber();
$evm->addEventSubscriber($eventSubscriber);

当我们软删除某个对象时,在向数据库发送任何查询之前将调用 preSoftDelete() 方法

$sdm->delete($fabpot);
$sdm->flush();

级联软删除

您可以通过以特定方式使用事件轻松实现级联软删除。假设您有一个 User 和 Post 文档,并且您想在删除用户时软删除其帖子。

您只需设置一个事件监听器,如下所示

use Doctrine\Common\EventSubscriber;

class CascadingSoftDeleteListener implements EventSubscriber
{
    public function preSoftDelete(LifecycleEventArgs $args)
    {
        $sdm = $args->getSoftDeleteManager();
        $document = $args->getDocument();
        if ($document instanceof User) {
            $sdm->deleteBy('Post', array('user.id' => $document->getId()));
        }
    }

    public function preRestore(LifecycleEventArgs $args)
    {
        $sdm = $args->getSoftDeleteManager();
        $document = $args->getDocument();
        if ($document instanceof User) {
            $sdm->restoreBy('Post', array('user.id' => $document->getId()));
        }
    }

    public function getSubscribedEvents()
    {
        return array(
            Events::preSoftDelete,
            Events::preRestore
        );
    }
}

现在,当您删除 User 的实例时,它也将删除任何引用被删除用户的 Post 文档。如果您恢复用户,他的 Post 文档也将被恢复。