google_tag-8.x-1.x-dev/src/EventSubscriber/ResponseSubscriber.php
src/EventSubscriber/ResponseSubscriber.php
<?php
declare(strict_types=1);
namespace Drupal\google_tag\EventSubscriber;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\google_tag\Ajax\GoogleTagEventCommand;
use Drupal\google_tag\EventCollectorInterface;
use Drupal\google_tag\TagContainerResolver;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
/**
* Acts on Drupal Kernel Response event.
*/
final class ResponseSubscriber implements EventSubscriberInterface {
/**
* Tag Container Resolver Service.
*
* @var \Drupal\google_tag\TagContainerResolver
*/
private TagContainerResolver $tagResolver;
/**
* Event Collector Service.
*
* @var \Drupal\google_tag\EventCollectorInterface
*/
private EventCollectorInterface $collector;
/**
* ResponseSubscriber constructor.
*
* @param \Drupal\google_tag\TagContainerResolver $tagResolver
* Google tag resolver.
* @param \Drupal\google_tag\EventCollectorInterface $collector
* Collector.
*/
public function __construct(TagContainerResolver $tagResolver, EventCollectorInterface $collector) {
$this->tagResolver = $tagResolver;
$this->collector = $collector;
}
/**
* {@inheritDoc}
*/
public static function getSubscribedEvents() {
return [
KernelEvents::RESPONSE => ['onResponse', 0],
];
}
/**
* Fires Ajax command to add gtag events for Ajax responses.
*
* @param \Symfony\Component\HttpKernel\Event\ResponseEvent $event
* Response event object.
*/
public function onResponse(ResponseEvent $event): void {
if (!$event->isMainRequest()) {
return;
}
$response = $event->getResponse();
if (!$response instanceof AjaxResponse) {
return;
}
$config = $this->tagResolver->resolve();
if ($config) {
foreach ($this->collector->getEvents() as $tag_event) {
$response->addCommand(new GoogleTagEventCommand(
$tag_event->getName(),
$tag_event->getData()
));
}
}
}
}
