src/EventSubscriber/Klaviyo.php line 36

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.             echo 111;
  49.             echo $e->getMessage();
  50.             die();
  51.         }
  52.     }
  53.     public function onEmailEntered(EmailEntered $event): void
  54.     {
  55.         try {
  56.             $this->klaviyoEmail->setEmail($event->getEmail());
  57.             $this->klaviyoProfileService->identify($event->getEmail());
  58.         } catch (Exception $e) {
  59.             echo 222;
  60.             echo $e->getMessage();
  61.             die();
  62.         }
  63.     }
  64.     public function onOrderStarted(OrderStartedEvent $event): void
  65.     {
  66.         try {
  67.             $items = [];
  68.             foreach ($event->getCartItems() as $item) {
  69.                 if (empty($item['id'])) {
  70.                     continue;
  71.                 }
  72.                 $product $this->prodRepository->find($item['id']);
  73.                 if (!$product) {
  74.                     continue;
  75.                 }
  76.                 $items[] = [
  77.                     'product_id' => $product->getId(),
  78.                     'name'       => $product->getName(),
  79.                     'price'      => $item['price'],
  80.                     'quantity'   => $item['num'],
  81.                 ];
  82.             }
  83.             $this->klaviyoEventService->track(
  84.                 'Started Checkout',
  85.                 $this->klaviyoEmail->getEmail(),
  86.                 [
  87.                     'total'    => $event->getAmount(),
  88.                     'currency' => Env::currency_code(),
  89.                     'items'    => $items,
  90.                 ]
  91.             );
  92.         } catch (Exception $e) {
  93.             echo 333;
  94.             echo $e->getMessage();
  95.             die();
  96.         }
  97.     }
  98.     public function onOrderMaked(OrderMakedEvent $event): void
  99.     {
  100.         try {
  101.             $this->klaviyoEventService->track(
  102.                 'Order Placed',
  103.                 $event->getOrder()->getEmail(),
  104.                 [
  105.                     'order_id'    => $event->getOrder()->getId(),
  106.                     'total'       => $event->getOrder()->getAmount(),
  107.                     'currency'    => Env::currency_code(),
  108.                     'items'       => array_values(array_map(fn($item) => [
  109.                         'product_id' => $item['id'],
  110.                         'name'       => $this->prodRepository->find($item['id'])->getName(),
  111.                         'price'      => $item['price'],
  112.                         'quantity'   => $item['num'],
  113.                     ], $event->getCartItems())),
  114.                 ]
  115.             );            
  116.         } catch (Exception $e) {
  117.             echo 444;
  118.             echo $e->getMessage();
  119.             die();
  120.         }
  121.     }
  122.     public function onProdViewed(ProdViewedEvent $event): void
  123.     {
  124.         try {
  125.             $product $event->getProd();
  126.             $this->klaviyoEventService->track(
  127.                 'Viewed Product',
  128.                 $this->klaviyoEmail->getEmail(),
  129.                 [
  130.                     'product_id' => $product->getId(),
  131.                     'name'       => $product->getName(),
  132.                     'price'      => $product->getPrice(),
  133.                     'url'        => $this->requestStack->getCurrentRequest()?->getUri() ?? '',
  134.                 ]
  135.             );
  136.         } catch (Exception $e) {
  137.             echo 555;
  138.             echo $e->getMessage();
  139.             die();
  140.         }
  141.     }
  142.     public function onKernelRequest(RequestEvent $event): void
  143.     {
  144.         // if (!$event->isMainRequest()) {
  145.         //     return;
  146.         // }
  147.         try {
  148.             if (!empty($this->klaviyoEmail->getEmail())) {
  149.                 return;
  150.             }
  151.             /** @var \App\Entity\User $user */
  152.             $user $this->security->getUser();
  153.             if (!$user) {
  154.                 return;
  155.             }
  156.             $email trim(strtolower($user->getEmail()));
  157.             
  158.             if (!filter_var($emailFILTER_VALIDATE_EMAIL)) {
  159.                 return;
  160.             }
  161.             $this->klaviyoEmail->setEmail($email);
  162.             $this->klaviyoProfileService->identify($email);
  163.         } catch (Exception $e) {
  164.             
  165.         }
  166.     }
  167.     public static function getSubscribedEvents(): array
  168.     {
  169.         return [
  170.             KernelEvents::REQUEST => 'onKernelRequest',
  171.             CartItemAdded::NAME => 'onCartItemAdded',
  172.             EmailEntered::NAME => 'onEmailEntered',
  173.             OrderMakedEvent::NAME => 'onOrderMakedEvent',
  174.             OrderStartedEvent::NAME => 'onOrderStarted',
  175.             ProdViewedEvent::NAME => 'onProdViewed',
  176.         ];
  177.     }
  178. }