app/Plugin/RefineCheckItem42/Event.php line 117

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of Refine
  4.  *
  5.  * Copyright(c) 2023 Refine Co.,Ltd. All Rights Reserved.
  6.  *
  7.  * https://www.re-fine.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 Plugin\RefineCheckItem42;
  13. use Doctrine\Common\Collections\ArrayCollection;
  14. use Eccube\Common\EccubeConfig;
  15. use Eccube\Request\Context;
  16. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  17. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  18. use Symfony\Component\HttpFoundation\Cookie;
  19. use Symfony\Component\HttpKernel\Event\KernelEvent;
  20. use Symfony\Component\HttpKernel\KernelEvents;
  21. class Event implements EventSubscriberInterface
  22. {
  23.     /**
  24.      * Cookie 名称
  25.      */
  26.     const COOKIE_NAME 'eccube_product_history';
  27.     /**
  28.      * Cookie 保存件数
  29.      */
  30.     const MAX_SAVE_NUM 10;
  31.     /**
  32.      * Cookie 保存日数
  33.      */
  34.     const MAX_SAVE_DAY 30;
  35.     /**
  36.      * @var EccubeConfig
  37.      */
  38.     private $eccubeConfig;
  39.     /**
  40.      * @var Context
  41.      */
  42.     private $context;
  43.     /**
  44.      * @param EccubeConfig $eccubeConfig
  45.      * @param Context $context
  46.      */
  47.     public function __construct(
  48.         EccubeConfig $eccubeConfig,
  49.         Context $context
  50.     ) {
  51.         $this->eccubeConfig $eccubeConfig;
  52.         $this->context $context;
  53.     }
  54.     /**
  55.      * {@inheritdoc}
  56.      */
  57.     public static function getSubscribedEvents()
  58.     {
  59.         return [
  60.             KernelEvents::RESPONSE => 'onKernelResponse',
  61.         ];
  62.     }
  63.     /**
  64.      * 商品詳細ページアクセス時に商品IDをCookieに保存する
  65.      *
  66.      * @param ResponseEvent $event
  67.      * @throws \Exception
  68.      */
  69.     public function onKernelResponse(ResponseEvent $event)
  70.     {
  71.         if (!$event->isMasterRequest() || $this->context->isAdmin()) {
  72.             return;
  73.         }
  74.         if ($event->getRequest()->get('_route') !== 'product_detail') {
  75.             return;
  76.         }
  77.         $productId $event->getRequest()->get('id');
  78.         if (!is_null($productId)) {
  79.             $this->setCookie($productId$event);
  80.         }
  81.     }
  82.     /**
  83.      * Cookie の取得
  84.      *
  85.      * @param KernelEvent $event
  86.      * @return array|mixed
  87.      */
  88.     private function getProductIdsFromCookie(KernelEvent $event)
  89.     {
  90.         $cookie $event->getRequest()->cookies->get(self::COOKIE_NAME);
  91.         return json_decode($cookietrue) ?? [];
  92.     }
  93.     /**
  94.      * Cookieに商品IDを追加
  95.      *
  96.      * @param $productId
  97.      * @param ResponseEvent $event
  98.      */
  99.     private function setCookie($productIdResponseEvent $event)
  100.     {
  101.         $productIds = (new ArrayCollection($this->getProductIdsFromCookie($event)))->toArray();
  102.         $key array_search($productId$productIds);
  103.         if (false !== $key) {
  104.             array_splice($productIds$key1);
  105.         }
  106.         $productIds[] = $productId;
  107.         if (self::MAX_SAVE_NUM count($productIds)) {
  108.             array_splice($productIds0count($productIds) - self::MAX_SAVE_NUM);
  109.         }
  110.         $cookie = new Cookie(
  111.             self::COOKIE_NAME,
  112.             json_encode($productIds),
  113.             (new \DateTime())->modify(self::MAX_SAVE_DAY ' day'),
  114.             $this->eccubeConfig['env(ECCUBE_COOKIE_PATH)']
  115.         );
  116.         $response $event->getResponse();
  117.         $response->headers->setCookie($cookie);
  118.         $event->setResponse($response);
  119.     }
  120. }