axsy / transactional-bundle
为控制器和服务提供事务包装器
1.0.0
2013-05-03 23:01 UTC
Requires
- jms/di-extra-bundle: *
- symfony/framework-bundle: >=2.1.0,<2.3-dev
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\JMSAopBundle
和JMS\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