[ECCUBE4] 特定の条件のときだけcontrollerを切り替える

EC-CUBE4にて特定の条件下では標準のcontrollerを乗っ取って別のcontrollerに処理を渡したいときのTipsです

なお、”特定の条件下”ではなくていつでも乗っ取りたいのなら、ルーティングそのものを上書きしてしまう方法が取れます

EC-CUBE既存のルーティングを上書きするには、同じパスと名前でルーティングを定義します。

EC-CUBE既存のルーティングを上書きする

Symfony Eventを使う

controllerの切り替えはSymfonyのeventの一つ、kernel.controllerでできるとのこと
ということでkernel.controllerのevent listnerを作成して、その中で”特定の条件になっているかどうか”を判断し、条件が満たされている場合はcontrollerを置き換える、という処理を実装しました

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class HogeListener implements EventSubscriberInterface
{
    
    public function onKernelController(FilterControllerEvent $event)
    {
        // 置き換え元のルーティング名
        $fromRoute = 'hoge_route';
        
        // 置き換え先のルーティング名
        $toRoute = 'fuga_route';
        
        $request =  $event->getRequest();
        $curRoute = $request->get('_route');
        
        if ($fromRoute !== $curRoute)
        {
            return;
        }
        
        if( 【特定の条件になっていない】 )
        {
            return;
        }
        
        $params = $request->query->all();
        $controller =  $event->getController()[0];
        $response = $controller->forwardToRoute($toRoute, [], $params);
        $event->setController(function() use ($response) {
            return $response;
        });
    }
    
    
    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::CONTROLLER => 'onKernelController',
        ];
    }
}

ほぼほぼSymfonyの機能だけで実装できました
ただ一点forwardToRouteはEC-CUBEの実装かと思うので、もし素のSymfonyで行う際はここは置き換える必要があるかと思います

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です