app/Plugin/NZOrderLink42/EventSubscriber/OrderLinkSubscriber.php line 51

Open in your IDE?
  1. <?php
  2. namespace Plugin\NZOrderLink42\EventSubscriber;
  3. use Eccube\Entity\Customer;
  4. use Eccube\Entity\Order;
  5. use Eccube\Event\EccubeEvents;
  6. use Eccube\Event\EventArgs;
  7. use Eccube\Repository\OrderRepository;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Psr\Log\LoggerInterface;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. class OrderLinkSubscriber implements EventSubscriberInterface
  12. {
  13.     /**
  14.      * @var OrderRepository
  15.      */
  16.     private $orderRepository;
  17.     /**
  18.      * @var EntityManagerInterface
  19.      */
  20.     private $entityManager;
  21.     /**
  22.      * @var LoggerInterface
  23.      */
  24.     private $logger;
  25.     public function __construct(
  26.         OrderRepository $orderRepository,
  27.         EntityManagerInterface $entityManager,
  28.         LoggerInterface $logger
  29.     ) {
  30.         $this->orderRepository $orderRepository;
  31.         $this->entityManager $entityManager;
  32.         $this->logger $logger;
  33.     }
  34.     public static function getSubscribedEvents()
  35.     {
  36.         return [
  37.             EccubeEvents::FRONT_ENTRY_INDEX_COMPLETE => 'onEntryComplete',
  38.         ];
  39.     }
  40.     /**
  41.      * 会員登録完了時に同じメールアドレスの非会員注文を紐付け
  42.      */
  43.     public function onEntryComplete(EventArgs $event)
  44.     {
  45.         /** @var Customer $customer */
  46.         $customer $event->getArgument('Customer');
  47.         
  48.         if (!$customer || !$customer->getEmail()) {
  49.             return;
  50.         }
  51.         $email $customer->getEmail();
  52.         // 同じメールアドレスの非会員注文を取得
  53.         $qb $this->orderRepository->createQueryBuilder('o');
  54.         $orders $qb
  55.             ->where('o.email = :email')
  56.             ->andWhere('o.Customer IS NULL')
  57.             ->setParameter('email'$email)
  58.             ->getQuery()
  59.             ->getResult();
  60.         if (empty($orders)) {
  61.             $this->logger->info('[NZOrderLink42] 紐付け対象の注文なし', [
  62.                 'customer_id' => $customer->getId(),
  63.                 'email' => $email,
  64.             ]);
  65.             return;
  66.         }
  67.         $linkedCount 0;
  68.         /** @var Order $order */
  69.         foreach ($orders as $order) {
  70.             $order->setCustomer($customer);
  71.             $linkedCount++;
  72.             
  73.             $this->logger->info('[NZOrderLink42] 注文を会員に紐付け', [
  74.                 'order_id' => $order->getId(),
  75.                 'order_no' => $order->getOrderNo(),
  76.                 'customer_id' => $customer->getId(),
  77.             ]);
  78.         }
  79.         $this->entityManager->flush();
  80.         $this->logger->info('[NZOrderLink42] 紐付け完了', [
  81.             'customer_id' => $customer->getId(),
  82.             'email' => $email,
  83.             'linked_count' => $linkedCount,
  84.         ]);
  85.     }
  86. }