doctrine / mongodb-odm-softdelete
此包已被废弃且不再维护。没有建议的替代包。
Doctrine MongoDB MongoDB SoftDelete 库
dev-master
2014-05-14 18:56 UTC
Requires
- php: >=5.3.2
- doctrine/mongodb-odm: *
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 文档也将被恢复。