CheckExpirePersistentQuoteObserver.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. /**
  3. *
  4. * Copyright © Magento, Inc. All rights reserved.
  5. * See COPYING.txt for license details.
  6. */
  7. namespace Magento\Persistent\Observer;
  8. use Magento\Framework\Event\ObserverInterface;
  9. class CheckExpirePersistentQuoteObserver implements ObserverInterface
  10. {
  11. /**
  12. * Customer session
  13. *
  14. * @var \Magento\Customer\Model\Session
  15. */
  16. protected $_customerSession;
  17. /**
  18. * Checkout session
  19. *
  20. * @var \Magento\Checkout\Model\Session
  21. */
  22. protected $_checkoutSession;
  23. /**
  24. * Core event manager proxy
  25. *
  26. * @var \Magento\Framework\Event\ManagerInterface
  27. */
  28. protected $_eventManager = null;
  29. /**
  30. * Persistent session
  31. *
  32. * @var \Magento\Persistent\Helper\Session
  33. */
  34. protected $_persistentSession = null;
  35. /**
  36. * @var \Magento\Persistent\Model\QuoteManager
  37. */
  38. protected $quoteManager;
  39. /**
  40. * Persistent data
  41. *
  42. * @var \Magento\Persistent\Helper\Data
  43. */
  44. protected $_persistentData = null;
  45. /**
  46. * Request
  47. *
  48. * @var \Magento\Framework\App\RequestInterface
  49. */
  50. private $request;
  51. /**
  52. * Checkout Page path
  53. *
  54. * @var string
  55. */
  56. private $checkoutPagePath = 'checkout';
  57. /**
  58. * @param \Magento\Persistent\Helper\Session $persistentSession
  59. * @param \Magento\Persistent\Helper\Data $persistentData
  60. * @param \Magento\Persistent\Model\QuoteManager $quoteManager
  61. * @param \Magento\Framework\Event\ManagerInterface $eventManager
  62. * @param \Magento\Customer\Model\Session $customerSession
  63. * @param \Magento\Checkout\Model\Session $checkoutSession
  64. * @param \Magento\Framework\App\RequestInterface $request
  65. */
  66. public function __construct(
  67. \Magento\Persistent\Helper\Session $persistentSession,
  68. \Magento\Persistent\Helper\Data $persistentData,
  69. \Magento\Persistent\Model\QuoteManager $quoteManager,
  70. \Magento\Framework\Event\ManagerInterface $eventManager,
  71. \Magento\Customer\Model\Session $customerSession,
  72. \Magento\Checkout\Model\Session $checkoutSession,
  73. \Magento\Framework\App\RequestInterface $request
  74. ) {
  75. $this->_persistentSession = $persistentSession;
  76. $this->quoteManager = $quoteManager;
  77. $this->_customerSession = $customerSession;
  78. $this->_checkoutSession = $checkoutSession;
  79. $this->_eventManager = $eventManager;
  80. $this->_persistentData = $persistentData;
  81. $this->request = $request;
  82. }
  83. /**
  84. * Check and clear session data if persistent session expired
  85. *
  86. * @param \Magento\Framework\Event\Observer $observer
  87. * @return void
  88. */
  89. public function execute(\Magento\Framework\Event\Observer $observer)
  90. {
  91. if (!$this->_persistentData->canProcess($observer)) {
  92. return;
  93. }
  94. if ($this->_persistentData->isEnabled() &&
  95. !$this->_persistentSession->isPersistent() &&
  96. !$this->_customerSession->isLoggedIn() &&
  97. $this->_checkoutSession->getQuoteId() &&
  98. !$this->isRequestFromCheckoutPage($this->request)
  99. // persistent session does not expire on onepage checkout page
  100. ) {
  101. $this->_eventManager->dispatch('persistent_session_expired');
  102. $this->quoteManager->expire();
  103. $this->_customerSession->setCustomerId(null)->setCustomerGroupId(null);
  104. }
  105. }
  106. /**
  107. * Check current request is coming from onepage checkout page.
  108. *
  109. * @param \Magento\Framework\App\RequestInterface $request
  110. * @return bool
  111. */
  112. private function isRequestFromCheckoutPage(\Magento\Framework\App\RequestInterface $request): bool
  113. {
  114. $requestUri = (string)$request->getRequestUri();
  115. $refererUri = (string)$request->getServer('HTTP_REFERER');
  116. /** @var bool $isCheckoutPage */
  117. $isCheckoutPage = (
  118. false !== strpos($requestUri, $this->checkoutPagePath) ||
  119. false !== strpos($refererUri, $this->checkoutPagePath)
  120. );
  121. return $isCheckoutPage;
  122. }
  123. }