src/EventSubscriber/Klaviyo.php line 19

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