You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
30 lines
680 B
30 lines
680 B
<?php |
|
|
|
namespace core\services; |
|
|
|
use core\dispatchers\DeferredEventDispatcher; |
|
|
|
class TransactionManager |
|
{ |
|
private $dispatcher; |
|
|
|
public function __construct(DeferredEventDispatcher $dispatcher) |
|
{ |
|
$this->dispatcher = $dispatcher; |
|
} |
|
|
|
public function wrap(callable $function): void |
|
{ |
|
$transaction = \Yii::$app->db->beginTransaction(); |
|
try { |
|
$this->dispatcher->defer(); |
|
$function(); |
|
$transaction->commit(); |
|
$this->dispatcher->release(); |
|
} catch (\Exception $e) { |
|
$transaction->rollBack(); |
|
$this->dispatcher->clean(); |
|
throw $e; |
|
} |
|
} |
|
} |