目次
やりたいこと
営業時間外は会員登録をさせたくない。そんな不便な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 のイベントを利用してみたかっただけなんだ…。こんな事もできますよという例でした。おわり。
コメントを残す