google_tag-8.x-1.x-dev/src/EventCollector.php
src/EventCollector.php
<?php declare(strict_types=1); namespace Drupal\google_tag; use Drupal\google_tag\Plugin\GoogleTag\Event\GoogleTagEventInterface; use Symfony\Component\HttpFoundation\Session\SessionInterface; /** * Event collector service. */ final class EventCollector implements EventCollectorInterface { /** * Events list. * * @phpstan-var array<int, \Drupal\google_tag\Plugin\GoogleTag\Event\GoogleTagEventInterface> */ private array $events = []; /** * Google Tag Event Service. * * @var \Drupal\google_tag\GoogleTagEventManager */ private GoogleTagEventManager $googleTagEventManager; /** * The Tag Container Resolver. * * @var \Drupal\google_tag\TagContainerResolver */ private TagContainerResolver $tagResolver; /** * Session service. * * @var \Symfony\Component\HttpFoundation\Session\SessionInterface */ private SessionInterface $session; /** * Collector constructor. * * @param \Drupal\google_tag\GoogleTagEventManager $googleTagEventManager * Event plugin manager. * @param \Drupal\google_tag\TagContainerResolver $tagResolver * Tag resolver service. * @param \Symfony\Component\HttpFoundation\Session\SessionInterface $session * Session service. */ public function __construct(GoogleTagEventManager $googleTagEventManager, TagContainerResolver $tagResolver, SessionInterface $session) { $this->googleTagEventManager = $googleTagEventManager; $this->tagResolver = $tagResolver; $this->session = $session; } /** * {@inheritDoc} * * @throws \Drupal\Component\Plugin\Exception\ContextException * @throws \Drupal\Component\Plugin\Exception\PluginException */ public function addEvent(string $name, array $contexts = []): void { $event = $this->createEventInstance($name, $contexts); if ($event === NULL) { return; } $this->events[] = $event; } /** * {@inheritDoc} * * @throws \Drupal\Component\Plugin\Exception\ContextException * @throws \Drupal\Component\Plugin\Exception\PluginException */ public function addDelayedEvent(string $name, array $contexts = []): void { $event = $this->createEventInstance($name, $contexts); if ($event === NULL) { return; } $delayed_events = $this->session->get('google_tag_events', []); $delayed_events[] = $event; $this->session->set('google_tag_events', $delayed_events); } /** * {@inheritDoc} */ public function getEvents(): array { $events = $this->events; $this->events = []; $delayed_events = $this->session->get('google_tag_events', []); if ($delayed_events !== []) { $this->session->set('google_tag_events', []); } return array_merge($delayed_events, $events); } /** * Instantiates an event plugin. * * @param string $name * Event name. * @param array $contexts * Event plugin context. * * @return \Drupal\google_tag\Plugin\GoogleTag\Event\GoogleTagEventInterface|null * Event plugin if configured, otherwise null. * * @throws \Drupal\Component\Plugin\Exception\ContextException * @throws \Drupal\Component\Plugin\Exception\PluginException */ private function createEventInstance(string $name, array $contexts = []): ?GoogleTagEventInterface { $config = $this->tagResolver->resolve(); if ($config === NULL || !$config->hasEvent($name)) { return NULL; } $event = $this->googleTagEventManager->createInstance( $name, $config->getEventConfiguration($name), ); assert($event instanceof GoogleTagEventInterface); foreach ($contexts as $id => $context) { $event->setContextValue($id, $context); } return $event; } }