EC-CUBE4 コントローラー のカスタマイズ方法をご紹介します。
はじめに
EC-CUBEでは、src/配下のファイルを直接変更するのはおすすめできません。アップデートしてしまうと、src/配下は変更されてしまいます。
コントローラーも例外ではありません。
なので!
変更したい場合は、Customize/配下にカスタマイズファイルを作成して処理を書きます!
コントローラー意外にも変更したい場合は、Customize/配下にファイルを作成します。
変更方法
EC-CUBE4 ではURLの設定をアノテーション(@Route)によって設定しています。この@Routeのnameを揃えることでURL設定の上書きが可能になります。
例に、会員登録のコントローラーを変更してみようと思います。
元々は、
<?php /* * This file is part of EC-CUBE * * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved. * * http://www.ec-cube.co.jp/ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Eccube\Controller; use Eccube\Entity\BaseInfo; use Eccube\Entity\Master\CustomerStatus; use Eccube\Event\EccubeEvents; use Eccube\Event\EventArgs; use Eccube\Form\Type\Front\EntryType; use Eccube\Repository\BaseInfoRepository; use Eccube\Repository\CustomerRepository; use Eccube\Repository\Master\CustomerStatusRepository; use Eccube\Service\MailService; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception as HttpException; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Validator\ValidatorInterface; use Eccube\Service\CartService; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; class EntryController extends AbstractController { /** * @var CustomerStatusRepository */ protected $customerStatusRepository; /** * @var ValidatorInterface */ protected $recursiveValidator; /** * @var MailService */ protected $mailService; /** * @var BaseInfo */ protected $BaseInfo; /** * @var CustomerRepository */ protected $customerRepository; /** * @var EncoderFactoryInterface */ protected $encoderFactory; /** * @var TokenStorageInterface */ protected $tokenStorage; /** * @var \Eccube\Service\CartService */ protected $cartService; /** * EntryController constructor. * * @param CartService $cartService * @param CustomerStatusRepository $customerStatusRepository * @param MailService $mailService * @param BaseInfoRepository $baseInfoRepository * @param CustomerRepository $customerRepository * @param EncoderFactoryInterface $encoderFactory * @param ValidatorInterface $validatorInterface * @param TokenStorageInterface $tokenStorage */ public function __construct( CartService $cartService, CustomerStatusRepository $customerStatusRepository, MailService $mailService, BaseInfoRepository $baseInfoRepository, CustomerRepository $customerRepository, EncoderFactoryInterface $encoderFactory, ValidatorInterface $validatorInterface, TokenStorageInterface $tokenStorage ) { $this->customerStatusRepository = $customerStatusRepository; $this->mailService = $mailService; $this->BaseInfo = $baseInfoRepository->get(); $this->customerRepository = $customerRepository; $this->encoderFactory = $encoderFactory; $this->recursiveValidator = $validatorInterface; $this->tokenStorage = $tokenStorage; $this->cartService = $cartService; } /** * 会員登録画面. * * @Route("/entry", name="entry") * @Template("Entry/index.twig") */ public function index(Request $request) { if ($this->isGranted('ROLE_USER')) { log_info('認証済のためログイン処理をスキップ'); return $this->redirectToRoute('mypage'); } /** @var $Customer \Eccube\Entity\Customer */ $Customer = $this->customerRepository->newCustomer(); /* @var $builder \Symfony\Component\Form\FormBuilderInterface */ $builder = $this->formFactory->createBuilder(EntryType::class, $Customer); $event = new EventArgs( [ 'builder' => $builder, 'Customer' => $Customer, ], $request ); $this->eventDispatcher->dispatch(EccubeEvents::FRONT_ENTRY_INDEX_INITIALIZE, $event); /* @var $form \Symfony\Component\Form\FormInterface */ $form = $builder->getForm(); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { switch ($request->get('mode')) { case 'confirm': log_info('会員登録確認開始'); log_info('会員登録確認完了'); return $this->render( 'Entry/confirm.twig', [ 'form' => $form->createView(), ] ); case 'complete': log_info('会員登録開始'); $encoder = $this->encoderFactory->getEncoder($Customer); $salt = $encoder->createSalt(); $password = $encoder->encodePassword($Customer->getPassword(), $salt); $secretKey = $this->customerRepository->getUniqueSecretKey(); $Customer ->setSalt($salt) ->setPassword($password) ->setSecretKey($secretKey) ->setPoint(0); $this->entityManager->persist($Customer); $this->entityManager->flush(); log_info('会員登録完了'); $event = new EventArgs( [ 'form' => $form, 'Customer' => $Customer, ], $request ); $this->eventDispatcher->dispatch(EccubeEvents::FRONT_ENTRY_INDEX_COMPLETE, $event); $activateFlg = $this->BaseInfo->isOptionCustomerActivate(); // 仮会員設定が有効な場合は、確認メールを送信し完了画面表示. if ($activateFlg) { $activateUrl = $this->generateUrl('entry_activate', ['secret_key' => $Customer->getSecretKey()], UrlGeneratorInterface::ABSOLUTE_URL); // メール送信 $this->mailService->sendCustomerConfirmMail($Customer, $activateUrl); if ($event->hasResponse()) { return $event->getResponse(); } log_info('仮会員登録完了画面へリダイレクト'); return $this->redirectToRoute('entry_complete'); } else { // 仮会員設定が無効な場合は、会員登録を完了させる. $qtyInCart = $this->entryActivate($request, $Customer->getSecretKey()); // URLを変更するため完了画面にリダイレクト return $this->redirectToRoute('entry_activate', [ 'secret_key' => $Customer->getSecretKey(), 'qtyInCart' => $qtyInCart, ]); } } } return [ 'form' => $form->createView(), ]; } //割愛 }
これを、以下のように変更してみましょう。
<?php //割愛 class EntryController extends AbstractController { //割愛 public function __construct( CartService $cartService, CustomerStatusRepository $customerStatusRepository, MailService $mailService, BaseInfoRepository $baseInfoRepository, CustomerRepository $customerRepository, EncoderFactoryInterface $encoderFactory, ValidatorInterface $validatorInterface, TokenStorageInterface $tokenStorage ) { $this->customerStatusRepository = $customerStatusRepository; $this->mailService = $mailService; $this->BaseInfo = $baseInfoRepository->get(); $this->customerRepository = $customerRepository; $this->encoderFactory = $encoderFactory; $this->recursiveValidator = $validatorInterface; $this->tokenStorage = $tokenStorage; $this->cartService = $cartService; } /** * 会員登録画面. * * @Route("/entry", name="entry") * @Template("Entry/index.twig") */ public function index(Request $request) { var_dump('test'); die(); return [ 'form' => $form->createView(), ]; } }
変わっていますね!
以上です。
@Templateを変更すると任意のtwigファイルを返却できます。
おわりに
ご覧いただきありがとうございます。
変更自体は簡単ですね。
こちらでマイグレーション方法も紹介していますので、
ご覧ください。EC-CUBE4 マイグレーション 実行と作成
コメント