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; | |
|         } | |
|     } | |
| } |