Задать вопрос

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

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

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


Я вот что-то слышал про события или может как-то можно провернуть такую штуку с помощью поведений, в общем подскажите пожалуйста как сделать транзакцию для всех экшинов ?
  • Вопрос задан
  • 6467 просмотров
Подписаться 6 Оценить Комментировать
Ответ пользователя Damir Makhmutov К ответам на вопрос (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'));


На работоспособность не проверял :-)
Ответ написан