Symfonyの機能を使ったカスタマイズ
概要
EC-CUBEは、SymfonyやDoctrineをベースに開発されています。 そのため、SymfonyやDoctrineが提供している拡張機構を利用することができます。
ここでは、代表的な拡張機構とその実装方法を紹介します。
Symfony Event
Symfonyのイベントシステムを利用することができます。
hello worldを表示するイベントリスナーを作成する
app/Customize/EventListener
配下ににHelloListener.php
を作成します。
<?php
namespace Customize\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class HelloListener implements EventSubscriberInterface
{
public function onResponse(FilterResponseEvent $event)
{
echo 'hello world';
}
public static function getSubscribedEvents()
{
return [
KernelEvents::RESPONSE => 'onResponse',
];
}
}
作成後、画面を表示(どのページでも表示されます)し、hello world
が表示されていれば成功です。
表示されない場合は、bin/console cache:clear --no-warmup
でキャッシュを削除してください。
また、bin/console debug:event-dispatcher
で登録されているイベントリスナーを確認できます。
イベントに関する詳細は以下を参照してください。
Command
bin/console
から実行できるコンソールコマンドを作成することが出来ます。
hello worldを表示するコマンドを作成する
app/Customize/Command
配下にHelloCommand.php
を作成します。
<?php
namespace Customize\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
class HelloCommand extends Command
{
// コマンド名
protected static $defaultName = 'acme:hello';
protected function execute(InputInterface $input, OutputInterface $output)
{
$io = new SymfonyStyle($input, $output);
// hello worldを表示
$io->success('hello world');
}
}
$defaultName
はコマンド名を表します。$io->success('hello world')
で、hello worldを表示します。
作成後、bin/console
で実行することができます。
$ bin/console acme:hello
[OK] hello world
※ コマンドが認識されない場合は、bin/console cache:clear --no-warmup
でキャッシュを削除してください。
Commandに関する詳細は以下を参照してください。
Doctrine Event
Doctrineのイベントシステムを利用することができます。
ショップ名にようこそを付与するイベントリスナーを作成する
app/Customize/Doctrine/EventSubscriber
配下にHelloEventSubscriber.php
を作成します。
<?php
namespace Customize\Doctrine\EventSubscriber;
use Doctrine\Common\EventSubscriber;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use Doctrine\ORM\Events;
use Eccube\Entity\BaseInfo;
class HelloEventSubscriber implements EventSubscriber
{
public function getSubscribedEvents()
{
return [Events::postLoad];
}
public function postLoad(LifecycleEventArgs $args)
{
$entity = $args->getObject();
if ($entity instanceof BaseInfo) {
$shopName = $entity->getShopName();
$shopName = 'ようこそ '.$shopName.' へ';
$entity->setShopName($shopName);
}
}
}
作成後、トップページを開き、ようこそ [ショップ名] へ
が表示されていれば成功です。
表示されない場合は、bin/console cache:clear --no-warmup
でキャッシュを削除してください。
イベントに関する詳細は以下を参照してください。
※ Doctrine Event Listeners and Subscribersでは、services.yaml
での設定方法が記載されていますが、EC-CUBEはDoctrineのイベントリスナーをコンテナへ自動登録します。そのため、services.yaml
での設定は不要です。
SymfonyのBundleを利用する
TODO