src/Eccube/EventListener/TransactionListener.php line 66

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.ec-cube.co.jp/
  8.  *
  9.  * For the full copyright and license information, please view the LICENSE
  10.  * file that was distributed with this source code.
  11.  */
  12. namespace Eccube\EventListener;
  13. use Doctrine\DBAL\Connection;
  14. use Doctrine\DBAL\TransactionIsolationLevel;
  15. use Doctrine\ORM\EntityManager;
  16. use Doctrine\ORM\EntityManagerInterface;
  17. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  18. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  19. use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
  20. use Symfony\Component\HttpKernel\Event\PostResponseEvent;
  21. use Symfony\Component\HttpKernel\KernelEvents;
  22. /**
  23.  * トランザクション制御のためのListener
  24.  */
  25. class TransactionListener implements EventSubscriberInterface
  26. {
  27.     /**
  28.      * @var EntityManagerInterface
  29.      */
  30.     protected $em;
  31.     /**
  32.      * @var bool
  33.      */
  34.     protected $isEnabled true;
  35.     /**
  36.      * TransactionListener constructor.
  37.      *
  38.      * @param EntityManager $em
  39.      * @param bool $isEnabled
  40.      */
  41.     public function __construct(EntityManagerInterface $em$isEnabled true)
  42.     {
  43.         $this->em $em;
  44.         $this->isEnabled $isEnabled;
  45.     }
  46.     /**
  47.      * Disable transaction listener.
  48.      */
  49.     public function disable()
  50.     {
  51.         $this->isEnabled false;
  52.     }
  53.     /**
  54.      * Kernel request listener callback.
  55.      *
  56.      * @param GetResponseEvent $event
  57.      */
  58.     public function onKernelRequest(GetResponseEvent $event)
  59.     {
  60.         if (!$this->isEnabled) {
  61.             log_debug('Transaction Listener is disabled.');
  62.             return;
  63.         }
  64.         if (!$event->isMasterRequest()) {
  65.             return;
  66.         }
  67.         /** @var Connection $Connection */
  68.         $Connection $this->em->getConnection();
  69.         if (!$Connection->isConnected()) {
  70.             $Connection->connect();
  71.         }
  72.         $Connection->setAutoCommit(false);
  73.         $Connection->setTransactionIsolation(TransactionIsolationLevel::READ_COMMITTED);
  74.         $this->em->beginTransaction();
  75.         log_debug('Begin Transaction.');
  76.     }
  77.     /**
  78.      * Kernel exception listener callback.
  79.      *
  80.      * @param GetResponseForExceptionEvent $event
  81.      */
  82.     public function onKernelException(GetResponseForExceptionEvent $event)
  83.     {
  84.         if (!$this->isEnabled) {
  85.             log_debug('Transaction Listener is disabled.');
  86.             return;
  87.         }
  88.         if (!$event->isMasterRequest()) {
  89.             return;
  90.         }
  91.         if ($this->em->getConnection()->isTransactionActive()) {
  92.             $this->em->rollback();
  93.             log_debug('Rollback executed.');
  94.         } else {
  95.             log_debug('Transaction is not active. Rollback skipped.');
  96.         }
  97.     }
  98.     /**
  99.      *  Kernel terminate listener callback.
  100.      *
  101.      * @param PostResponseEvent $event
  102.      */
  103.     public function onKernelTerminate(PostResponseEvent $event)
  104.     {
  105.         if (!$this->isEnabled) {
  106.             log_debug('Transaction Listener is disabled.');
  107.             return;
  108.         }
  109.         if ($this->em->getConnection()->isTransactionActive()) {
  110.             if ($this->em->getConnection()->isRollbackOnly()) {
  111.                 $this->em->rollback();
  112.                 log_debug('Rollback executed.');
  113.             } else {
  114.                 $this->em->commit();
  115.                 log_debug('Commit executed.');
  116.             }
  117.         } else {
  118.             log_debug('Transaction is not active. Rollback skipped.');
  119.         }
  120.     }
  121.     /**
  122.      * Return the events to subscribe to.
  123.      *
  124.      * @return array
  125.      */
  126.     public static function getSubscribedEvents()
  127.     {
  128.         return [
  129.             KernelEvents::REQUEST => 'onKernelRequest',
  130.             KernelEvents::EXCEPTION => 'onKernelException',
  131.             KernelEvents::TERMINATE => 'onKernelTerminate',
  132.         ];
  133.     }
  134. }