[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',
];
}
}
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', ]; } }
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で行う際はここは置き換える必要があるかと思います

コメントを残す

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