<?php
/*
* Copyright(c) 2019 SYSTEM FRIEND INC.
*/
namespace Plugin\CheckProduct42\EventSubscriber;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Plugin\CheckProduct42\Service\CookieHelper;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class CheckProductEvent implements EventSubscriberInterface
{
protected \Plugin\CheckProduct42\Common\EccubeConfigEx $checkProductConfig;
protected CookieHelper $cookieHelper;
protected $cookie;
/**
* CheckProductEvent constructor.
*
* @param \Plugin\CheckProduct42\Common\EccubeConfigEx $checkProductConfig
* @param CookieHelper $cookieHelper
*/
public function __construct(
\Plugin\CheckProduct42\Common\EccubeConfigEx $checkProductConfig,
CookieHelper $cookieHelper
)
{
$this->checkProductConfig = $checkProductConfig;
$this->cookieHelper = $cookieHelper;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
KernelEvents::RESPONSE => 'onKernelResponse',
EccubeEvents::FRONT_PRODUCT_DETAIL_INITIALIZE => 'createCookie',
];
}
/**
* クッキーに商品IDを保存
*
* @param ResponseEvent $event
* @throws \Exception
*/
public function onKernelResponse(ResponseEvent $event)
{
$request = $event->getRequest();
if ($request->get('_route') !== 'product_detail') {
return;
}
if($this->cookie){
$response = $this->cookieHelper->setCookie($event->getResponse(), $this->cookie);
// Cookieをレスポンスにセット
$event->setResponse($response);
}
}
/**
* クッキーを作成
*
* @param EventArgs $event
* @throws \Exception
*/
public function createCookie(EventArgs $event)
{
$Product = $event->getArgument('Product');
$arr = $this->cookieHelper->getProductIds();
array_unshift($arr, $Product->getId());
$arr = array_unique($arr);
$max = $this->checkProductConfig->number_of_items();
$arr = array_slice($arr, 0, $max);
// 保持期間1ヶ月
$expire = new \DateTime();
$month = 1;
$expire->modify("$month month");
// Cookie作成
$cookie = new Cookie(
$this->cookieHelper->getCookieName(),
implode(',', $arr),
$expire,
$this->checkProductConfig->get('env(ECCUBE_COOKIE_PATH)')
);
$this->cookie = $cookie;
}
}