Как организовать транзакции в Yii2 без повторения кода?

Ситуация такая, к примеру у меня в админке ведется мониторинг каждого действия. Тоесть если я создаю или удаляю страницу, записи об этом летят в админ мониторинг. Это значит что мне нужна транзакция в каждом экшине.

Писать подобный код в каждом экшине не вариант
$transaction = $connection->beginTransaction();
try {
   ...
    $transaction->commit();
} catch (Exception $e) {
    $transaction->rollBack();
}


Я вот что-то слышал про события или может как-то можно провернуть такую штуку с помощью поведений, в общем подскажите пожалуйста как сделать транзакцию для всех экшинов ?
  • Вопрос задан
  • 6466 просмотров
Пригласить эксперта
Ответы на вопрос 2
Можно воспользоваться решением в лоб.

protected function inTransaction($fn) {
         $connection = ...
         $transaction = $connection->beginTransaction();
         $result = false;

         try {
            $result = call_user_func($fn);
            $transaction->commit();
        } catch (Exception $e) {
            $transaction->rollBack();
        }
        
        return $result;
    }


Usage:

$result = $this->inTransaction(function() use ($data) {
    ...
});

$result = $this->inTransaction(array('ClassName', 'methodName'));


На работоспособность не проверял :-)
Ответ написан
sanchezzzhak
@sanchezzzhak
Ля ля ля...
Я бы не стал пихать транзакции везде, где этого не нужно.
Ну раз нужно, то да можно через события сделать, для этого они и предназначены.

Создайте для себя базовый контроллер и наследуйте его для всех остальных
public function init()
	{
		parent::init();
		$this->on(Controller::EVENT_AFTER_ACTION,[$this,'onAfterAction']);
		$this->on(Controller::EVENT_BEFORE_ACTION,[$this,'onBeforeAction']);
	}

	public function onAfterAction()
	{
		print "onAfterAction ";
	}

	public function onBeforeAction()
	{
		print "onBeforeAction ";
	}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы