要望や症状
EC-CUBE 4.1系において、ログアウトボタンを押した際にトップページではなく、特定のページ(user_data/page)にリダイレクトしたい。
理由や原因
EC-CUBE 4系では、ログアウト処理のリダイレクト先がデフォルトでトップページに設定されている。3系とは異なり、設定ファイルの構造や処理フローが変更されているため、同様の手法では対応できない。
ログアウト処理は、SecurityControllerまたはSymfonyのセキュリティ機能によって制御されており、リダイレクト先の変更にはイベントリスナーまたはカスタマイズが必要となる。
解決策
Customizeディレクトリでのイベントリスナー実装
以下の手順でログアウト後のリダイレクト先を変更できる。
1. イベントリスナーの作成
// app/Customize/EventListener/LogoutSuccessListener.php
<?php
namespace Customize\EventListener;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Http\Event\LogoutEvent;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class LogoutSuccessListener
{
private $urlGenerator;
public function __construct(UrlGeneratorInterface $urlGenerator)
{
$this->urlGenerator = $urlGenerator;
}
public function onLogout(LogoutEvent $event)
{
// カスタムページのルート名を指定
$redirectUrl = $this->urlGenerator->generate('user_data_custom_page');
$response = new RedirectResponse($redirectUrl);
$event->setResponse($response);
}
}
2. サービス定義の追加
# app/Customize/Resource/config/services.yaml
services:
Customize\EventListener\LogoutSuccessListener:
arguments:
- '@router'
tags:
- { name: kernel.event_listener, event: Symfony\Component\Security\Http\Event\LogoutEvent, method: onLogout }
3. カスタムページのルート確認
user_data/pageで作成したページのルート名を確認し、上記コードのuser_data_custom_page部分を実際のルート名に置き換える。
bin/console debug:router | grep user_data
4. キャッシュのクリア
bin/console cache:clear