EC-CUBE4:eventListner(controller以外)でアノテーションからURLを取得したりリダイレクトしたりする

EC-CUBE4で、controllerだとリダイレクトするのは簡単。

$this->redirectToRoute('hoge');

でも、eventListnerだと???

・__constructでcontainerを取得する
・containerからrouterを取得する
・redirectResponseオブジェクトを作って、イベントのレスポンスとして返す

の手順で実現できた。
(もっと簡単な方法あるのだろうか…)

<?php

namespace Customize\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Routing\Generator\urlGeneratorInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;

class hogeEvent implements EventSubscriberInterface
{
    protected $container;
    protected $router;

    /**
     * hogeListener constructor.
     */
    public function __construct(
        ContainerInterface $container
    ) {
        $this->container = $container;
        $this->router = $this->container->get('router');
    }

    public static function getSubscribedEvents()
    {
        return [
            // hoge処理完了
            EccubeEvents::FRONT_HOGE_COMPLETE => 'onFrontHogeComplete',
        ];
    }

    /**
     * hoge時りダイレクト先を変更する処理
     *
     * @param EventArgs $event
     */
    public function onFrontHogeComplete(EventArgs $event)
    {
        $url = $this->router->generate('shopping_login'); //例えば、shoppingのログインページ
        $response = new RedirectResponse($url);
        $event->setResponse($response);
    }
}

containerでget(‘サービスのID’)でサービスを取得、メソッドが使えるようになるので、超便利。というか万能では?
$router = $this->container->get(‘router’);
$abstractController = $this->container->get(‘Eccube\Controller\AbstractController’);

参考:
[EC-CUBE4始めました]
https://blog.e2info.co.jp/2018/11/21/ec-cube4%E5%A7%8B%E3%82%81%E3%81%BE%E3%81%97%E3%81%9F/