enterprisephp / doctrine-lock-bundle

防止对象在删除、更新事件中被锁定

v1.0 2016-01-10 16:48 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:52:55 UTC


README

  • 防止对象在插入、删除、更新事件中被锁定
  • 防止实体在删除、更新事件中被锁定

SensioLabsInsight knpbundles.com

相关链接;###

安装

步骤 1: 下载 Bundle

打开命令行控制台,进入你的项目目录,并执行以下命令以下载此 Bundle 的最新版本

$ composer require enterprisephp/doctrine-lock-bundle "dev-master"

此命令需要你全局安装了 Composer,具体请参阅 Composer 文档的安装章节

步骤 2: 启用 Bundle

然后,将 Bundle 添加到项目 app/AppKernel.php 文件中注册的 Bundle 列表

<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...

            new EP\DoctrineLockBundle\EPDoctrineLockBundle(),
        );

        // ...
    }

    // ...
}

用法

Doctrine 对象锁定

use EP\DoctrineLockBundle\Params\ObjectLockParams;
// ...
$objectLocker = $container->get('ep.doctrine.object.locker');
//lock fully
$objectLocker->lock(new DummyEntity());
//lock delete process
$objectLocker->lock(new DummyEntity(), ObjectLockParams::DELETE_LOCK);
//lock insert process
$objectLocker->lock(new DummyEntity(), ObjectLockParams::INSERT_LOCK);
//lock update process
$objectLocker->lock(new DummyEntity(), ObjectLockParams::UPDATE_LOCK);

Doctrine 对象解锁

use EP\DoctrineLockBundle\Params\ObjectLockParams;
// ...
$objectLocker = $container->get('ep.doctrine.object.locker');
//unlock full lock
$objectLocker->unlock(new DummyEntity());
//unlock delete process
$objectLocker->unlock(new DummyEntity(), ObjectLockParams::DELETE_LOCK);
//unlock insert process
$objectLocker->unlock(new DummyEntity(), ObjectLockParams::INSERT_LOCK);
//unlock update process
$objectLocker->unlock(new DummyEntity(), ObjectLockParams::UPDATE_LOCK);

Doctrine 对象切换锁定

use EP\DoctrineLockBundle\Params\ObjectLockParams;
// ...
$objectLocker = $container->get('ep.doctrine.object.locker');
//switch full lock
$objectLocker->switchLock(new DummyEntity());
//switch delete process
$objectLocker->switchLock(new DummyEntity(), ObjectLockParams::DELETE_LOCK);
//switch insert process
$objectLocker->switchLock(new DummyEntity(), ObjectLockParams::INSERT_LOCK);
//unswitchlock update process
$objectLocker->switchLock(new DummyEntity(), ObjectLockParams::UPDATE_LOCK);

Doctrine 对象是否被锁定

use EP\DoctrineLockBundle\Params\ObjectLockParams;
// ...
$objectLocker = $container->get('ep.doctrine.object.locker');
//is full locked
$objectLocker->isLocked(new DummyEntity());
//is delete locked
$objectLocker->isLocked(new DummyEntity(), ObjectLockParams::DELETE_LOCK);
//is insert locked
$objectLocker->isLocked(new DummyEntity(), ObjectLockParams::INSERT_LOCK);
//is update locked
$objectLocker->isLocked(new DummyEntity(), ObjectLockParams::UPDATE_LOCK);

示例使用

$objectLocker = $container->get('ep.doctrine.object.locker');
//lock object
$objectLocker->lock(new DummyEntity());
$em->persist(new DummyEntity()); // this will throw LockedObjectException

Doctrine 实体锁定

添加 Lockable 注解和 lockable 特性

namespace AppBundle\Entity;

use EP\DoctrineLockBundle\Traits\LockableTrait;
use EP\DoctrineLockBundle\Annotations\Lockable;

/**
 * @Lockable
 */
class DummyEntity
{
    use LockableTrait;
    // ...

示例使用

//create new dummy entity
$dummyEntity = new DummyEntity();
$dummyEntity
    ->setTitle('Dummy Entity Title')
    ->setDescription('Dummy Entity Description')
    ->setUpdateLocked(true) //lock entity for update process
    ->setDeleteLocked(true) //lock entity for delete process
;
$em->persist($dummyEntity);
$em->flush();

$dummyEntity->setTitle('Update Dummy Entity Title');
$em->persist($dummyEntity);
$em->flush(); // this will throw LockedEntityException because entity have update lock

$em->remove($dummyEntity); // this will throw LockedEntityException because entity have delete lock
解锁实体锁定
//unlock update lock
$dummyEntity->setUpdateLocked(false);
//unlock delete lock
$dummyEntity->setDeleteLocked(false);