EC-CUBE4 KernelEvents::CONTROLLER 営業時間外は会員登録させない方法

やりたいこと

営業時間外は会員登録をさせたくない。そんな不便なECサイトあって良いんか…、と思うが…。

今回は Symfony Event の KernelEvents::CONTROLLER を利用します。コントローラー実行前にこのイベントが呼ばれますので、EntryController であるか営業時間内であるかをチェックして営業時間外だったら homepage へリダイレクトするといったのを実装をしてみたいと思います。

やり方

Event の実装は app/Customize/EventSubscriber ディレクトリ内で実装していきます。

イベントを登録しイベント内容を実装

今回やりたいことを実装すると以下の通りになります。

app/Customize/EventSubscriber/EntryBusinessHourEvent.php
<?php

namespace Customize\EventSubscriber;

use Eccube\Controller\EntryController;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class EntryBusinessHourEvent implements EventSubscriberInterface
{

    /** @var Router */
    protected $router;

    /**
     * constructor.
     * @param Router $router
     */
    public function __construct(
        Router $router
    ) {
        $this->router = $router;
    }

    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::CONTROLLER => 'onEntryBusinessHours',
        ];
    }

    /**
     * 営業時間外の会員登録はできない、その場合は homepage へリダイレクトする。
     * @param FilterControllerEvent $event
     */
    public function onEntryBusinessHours(FilterControllerEvent $event){
        $controller = $event->getController();

        if(!is_array($controller)) return;

        $start = strtotime('08:00:00');
        $end = strtotime('17:00:00');
        $now = strtotime(date('H:i:s'));
        $is_business_hours = $start <= $now && $now < $end;

        if($controller[0] instanceof EntryController and !$is_business_hours){
            $event->setController(function() {
                $url = $this->router->generate("homepage");
                return new RedirectResponse($url);
            });
        }
    }
}

営業時間をAM8:00〜PM17:00としました。現在時刻が営業時間外であるか、かつ実行中のコントローラーがEntryControllerであるかをチェックし、そうであれば homepage (TOPページ) へリダイレクトします。

補足ですが、$controller = $event->getController(); は配列になっていて、0番目はコントローラーオブジェクト、1番目はアクション名を返します。

dump($controller);
array:2 [▼
  0 => EntryController {#4298 ▶}
  1 => "index"
]

以上になります。

さいごに

そもそも論ですが、、EntryControllerのイベントをキャッチして営業時間判定をすればいいじゃん!

いや…、KernelEvents::CONTROLLER のイベントを利用してみたかっただけなんだ…。こんな事もできますよという例でした。おわり。

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA