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