<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
*
* http://www.ec-cube.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Customize\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* コントローラが実行される直前のイベントリスナー。
* @see https://symfony.com/doc/4.4/components/http_kernel.html#component-http-kernel-event-table
*/
class ControllerListener implements EventSubscriberInterface
{
/** @var string COMPLETE_CONTROLLER アンケート完了画面のルーティング名 */
const COMPLETE_CONTROLLER = 'se_enquete_complete';
/** @var array REDIRECT_REFERER_TARGETS アンケート詳細のリファラからリダイレクトコントローラを選択する */
const REDIRECT_REFERER_TARGETS = array(
'sample' => 1,
'withdrawal' => 2,
'forgot_address' => 3,
);
public function __construct()
{
}
/**
* 対応するメソッドと優先度を登録する。
* 数値が高いほど優先度高。
*
* @see https://symfony.com/doc/4.4/event_dispatcher.html
*
* @return array
*/
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER => [
['enquateRedirector', 0],
]
];
}
/**
* アンケートフォームのコントローラを検知し、指定したテンプレートを読み込むファイルにリダイレクトする。
*
* @param ControllerEvent $event
* @return RedirectResponse|void
*/
public function enquateRedirector(ControllerEvent $event)
{
$request = $event->getRequest();
$controller = $event->getController();
// $kernel = $event->getKernel();
global $kernel;
$container = $kernel->getContainer();
$route = $request->get('_route', '');
$referer = $request->headers->get('referer', '');
$matchRoute = '';
if ($route !== self::COMPLETE_CONTROLLER) {
return;
}
foreach (self::REDIRECT_REFERER_TARGETS as $name => $id) {
$compareUrl = $container->get('router')->generate('se_enquete_detail', ['id' => $id], UrlGeneratorInterface::ABSOLUTE_URL);
if ($compareUrl === $referer) {
$matchRoute = $name;
}
}
if ($matchRoute === '') {
return;
}
switch ($matchRoute) {
case 'sample':
break;
case 'withdrawal':
break;
case 'forgot_address':
$redirectUrl = $container->get('router')->generate('enquete/form_complete/{form}', ['form' => 'forgot_address'], UrlGeneratorInterface::ABSOLUTE_PATH);
$event->setController(function () use ($redirectUrl) {
return new RedirectResponse($redirectUrl);
});
break;
default:
break;
}
}
}