axsy/transactional-bundle

为控制器和服务提供事务包装器

安装: 15

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

1.0.0 2013-05-03 23:01 UTC

This package is not auto-updated.

Last update: 2024-09-23 09:58:55 UTC


README

此包为控制器和服务提供事务包装器。在最简单的情况下,使用方法只需在控制器操作或某些服务方法上添加@Transactionable注解

use Axsy\TransactionalBundle\Annotation\Transactionable;

// Acme/SomeBundle/Controllers/SomeController.php
class SomeController extends Controller
{
    /**
     * @Transactionable
     */
    public function performRollbackOnExceptionAction()
    {
        // Persist some changes to the database using Doctrine DBAL or Doctrine ORM, whatever
        // ...
        // ...

        // Throw an exceptions
        // All changes performed upper will be rolled back
        throw new \RuntimeException();
    }
}

use Axsy\TransactionalBundle\Annotation\Transactionable;

// Acme/SomeBundle/SomeService.php
class SomeService
{
    /**
     * @Transactionable
     */
    public function performRollbackOnException()
    {
        // ...
    }

    // ...
    // ...
}

以下有一些选项可以自定义@Transactionable的行为,请见下文。

安装

此包可以通过composer安装。只需将以下行添加到composer.json

// composer.json
{
    // ...
    require: {
        // ...
        "axsy/transactional-bundle": "dev-master"
    }
}

请将上面的片段中的dev-master替换为最新的稳定分支,例如1.0.*。请检查GitHub上的标签,了解哪些版本可用。

然后,您可以通过在您的composer.json文件所在的目录中运行Composer的update命令来安装新的依赖项

php composer.phar update

现在,Composer将自动下载所有必需的文件,并为您安装它们。剩下要做的就是更新您的AppKernel.php文件,并注册新的包

// in AppKernel::registerBundles()
$bundles = array(
    // ...
    new Axsy\TransactionalBundle\AxsyTransactionalBundle(),
    // ...
);

请确保已注册JMS\AopBundle\JMSAopBundleJMS\DiExtraBundle\JMSDiExtraBundle。它们在Symfony标准版发行版中默认已注册。

配置

此包允许设置默认的Doctrine DBAL连接和/或默认的事务隔离级别。默认情况下,以下设置被接受

axsy_transactional:
    default_connection:   default

    # Supported isolations are read_uncommitted, read_committed, repeatable_read, serializable
    default_isolation:    read_committed

@Transactionable

此注解允许覆盖默认的连接名称和事务隔离级别

use Axsy\TransactionalBundle\Annotation\Transactionable;

// Acme/SomeBundle/SomeService.php
class SomeService
{
    /**
     * Transactionable(connection="other", isolation="read_uncommitted")
     */
    public function performRollbackOnException()
    {
        // ...
    }
}

您还可以显式列出将“透明”于事务并成功提交的异常类名

use Axsy\TransactionalBundle\Annotation\Transactionable;

// Acme/SomeBundle/Controllers/SomeController.php
class SomeController extends Controller
{
    /**
     * @Transactionable(noRollbackFor={"Symfony\Component\HttpKernel\Exception\NotFoundHttpException"})
     */
    public function performCommitOnNotFoundHttpExceptionAction()
    {
        // ...
    }
}

反之亦然

use Axsy\TransactionalBundle\Annotation\Transactionable;

// Acme/SomeBundle/SomeService.php
class SomeService
{
    /**
     * @Transactionable(rollbackFor={"Acme\SomeBundle\Exceptions\VeryBadException"})
     */
    public function performRollbackOnVeryBadExceptionOnly()
    {
        // ...
    }
}

@Transactionable注解可以在类级别定义。这样,控制器/服务的所有方法都将自动添加注解

use Axsy\TransactionalBundle\Annotation\Transactionable;

// Acme/SomeBundle/Controllers/SomeController.php
/**
 * @Transactionable(noRollbackFor={"Symfony\Component\HttpKernel\Exception\NotFoundHttpException"})
 */
class SomeController extends Controller
{
    public function performCommitOnNotFoundHttpExceptionAction()
    {
        // ...
    }

    public function thisTooAction()
    {
        // ...
    }
}

可以在方法级别覆盖全局定义注解的一些设置

use Axsy\TransactionalBundle\Annotation\Transactionable;

// Acme/SomeBundle/SomeService.php
/**
 * @Transactionable(rollbackFor={"Acme\SomeBundle\Exceptions\VeryBadException"})
 */
class SomeService
{
    public function performRollbackOnVeryBadExceptionOnlyOnDefaultConnection()
    {
        // ...
    }

    /**
     * @Transactionable(connection="other")
     */
    public function performRollbackOnVeryBadExceptionOnlyOnOtherConnection()
    {
        // ...
    }
}

测试

您可以从应用程序的根目录运行以下命令来简单地运行包的测试

cp vendor/axsy/transactional-bundle/Axsy/TransactionalBundle/phpunit.xml.desc vendor/axsy/transactional-bundle/Axsy/TransactionalBundle/phpunit.xml
phpunit -c vendor/axsy/transactional-bundle/Axsy/TransactionalBundle/phpunit.xml