src/EventSubscriber/Klaviyo.php line 146

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Env;
  4. use App\Event\CartItemAdded;
  5. use App\Event\EmailEntered;
  6. use App\Event\OrderMakedEvent;
  7. use App\Event\OrderStartedEvent;
  8. use App\Event\ProdViewedEvent;
  9. use App\Repository\ProdRepository;
  10. use App\Service\Klaviyo\KlaviyoEmail;
  11. use App\Service\Klaviyo\KlaviyoEventService;
  12. use App\Service\Klaviyo\KlaviyoProfileService;
  13. use Exception;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. use Symfony\Component\HttpKernel\Event\RequestEvent;
  17. use Symfony\Component\HttpKernel\KernelEvents;
  18. use Symfony\Component\Security\Core\Security;
  19. class Klaviyo implements EventSubscriberInterface
  20. {
  21.     public function __construct(
  22.         private KlaviyoProfileService $klaviyoProfileService,        
  23.         private KlaviyoEventService $klaviyoEventService,
  24.         private RequestStack $requestStack,
  25.         private KlaviyoEmail $klaviyoEmail,
  26.         private ProdRepository $prodRepository,  
  27.         private Security $security
  28.     )
  29.     {
  30.         
  31.     }
  32.     public function onCartItemAdded(CartItemAdded $event): void
  33.     {
  34.         try {
  35.             $this->klaviyoEventService->track(
  36.                 'Added to Cart',
  37.                 $this->klaviyoEmail->getEmail(),
  38.                 [
  39.                     'product_id'   => $event->getProd()->getId(),
  40.                     'product_name' => $event->getProd()->getName(),
  41.                     'price'        => $event->getProd()->getPrice(),
  42.                     'quantity'     => $event->getNum(),
  43.                     'cart_value'   => $event->getCartAmount(),
  44.                     'url'          => $this->requestStack->getCurrentRequest()->getUri(),
  45.                 ]
  46.             );
  47.         } catch (Exception $e) {
  48.         }
  49.     }
  50.     public function onEmailEntered(EmailEntered $event): void
  51.     {
  52.         try {
  53.             $this->klaviyoEmail->setEmail($event->getEmail());
  54.             $this->klaviyoProfileService->identify($event->getEmail());
  55.         } catch (Exception $e) {
  56.         }
  57.     }
  58.     public function onOrderStarted(OrderStartedEvent $event): void
  59.     {
  60.         try {
  61.             $items = [];
  62.             foreach ($event->getCartItems() as $item) {
  63.                 if (empty($item['id'])) {
  64.                     continue;
  65.                 }
  66.                 $product $this->prodRepository->find($item['id']);
  67.                 if (!$product) {
  68.                     continue;
  69.                 }
  70.                 $items[] = [
  71.                     'product_id' => $product->getId(),
  72.                     'name'       => $product->getName(),
  73.                     'price'      => $item['price'],
  74.                     'quantity'   => $item['num'],
  75.                 ];
  76.             }
  77.             $this->klaviyoEventService->track(
  78.                 'Started Checkout',
  79.                 $this->klaviyoEmail->getEmail(),
  80.                 [
  81.                     'total'    => $event->getAmount(),
  82.                     'currency' => Env::currency_code(),
  83.                     'items'    => $items,
  84.                 ]
  85.             );
  86.         } catch (Exception $e) {
  87.         }
  88.     }
  89.     public function onOrderMaked(OrderMakedEvent $event): void
  90.     {
  91.         try {
  92.             $this->klaviyoEventService->track(
  93.                 'Order Placed',
  94.                 $event->getOrder()->getEmail(),
  95.                 [
  96.                     'order_id'    => $event->getOrder()->getId(),
  97.                     'total'       => $event->getOrder()->getAmount(),
  98.                     'currency'    => Env::currency_code(),
  99.                     'items'       => array_values(array_map(fn($item) => [
  100.                         'product_id' => $item['id'],
  101.                         'name'       => $this->prodRepository->find($item['id'])->getName(),
  102.                         'price'      => $item['price'],
  103.                         'quantity'   => $item['num'],
  104.                     ], $event->getCartItems())),
  105.                 ]
  106.             );            
  107.         } catch (Exception $e) {
  108.         }
  109.     }
  110.     public function onProdViewed(ProdViewedEvent $event): void
  111.     {
  112.         try {
  113.             $product $event->getProd();
  114.             $this->klaviyoEventService->track(
  115.                 'Viewed Product',
  116.                 $this->klaviyoEmail->getEmail(),
  117.                 [
  118.                     'product_id' => $product->getId(),
  119.                     'name'       => $product->getName(),
  120.                     'price'      => $product->getPrice(),
  121.                     'url'        => $this->requestStack->getCurrentRequest()?->getUri() ?? '',
  122.                 ]
  123.             );
  124.         } catch (Exception $e) {
  125.         }
  126.     }
  127.     public function onKernelRequest(RequestEvent $event): void
  128.     {
  129.         // if (!$event->isMainRequest()) {
  130.         //     return;
  131.         // }
  132.         try {
  133.             if (!empty($this->klaviyoEmail->getEmail())) {
  134.                 return;
  135.             }
  136.             /** @var \App\Entity\User $user */
  137.             $user $this->security->getUser();
  138.             if (!$user) {
  139.                 return;
  140.             }
  141.             $email trim(strtolower($user->getEmail()));
  142.             
  143.             if (!filter_var($emailFILTER_VALIDATE_EMAIL)) {
  144.                 return;
  145.             }
  146.             $this->klaviyoEmail->setEmail($email);
  147.             $this->klaviyoProfileService->identify($email);
  148.         } catch (Exception $e) {
  149.             
  150.         }
  151.     }
  152.     public static function getSubscribedEvents(): array
  153.     {
  154.         return [
  155.             KernelEvents::REQUEST => 'onKernelRequest',
  156.             CartItemAdded::NAME => 'onCartItemAdded',
  157.             EmailEntered::NAME => 'onEmailEntered',
  158.             OrderMakedEvent::NAME => 'onOrderMakedEvent',
  159.             OrderStartedEvent::NAME => 'onOrderStarted',
  160.             ProdViewedEvent::NAME => 'onProdViewed',
  161.         ];
  162.     }
  163. }