Version 1
[yaffs-website] / web / core / lib / Drupal / Core / EventSubscriber / KernelDestructionSubscriber.php
diff --git a/web/core/lib/Drupal/Core/EventSubscriber/KernelDestructionSubscriber.php b/web/core/lib/Drupal/Core/EventSubscriber/KernelDestructionSubscriber.php
new file mode 100644 (file)
index 0000000..0619695
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+
+namespace Drupal\Core\EventSubscriber;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerAwareTrait;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\PostResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+/**
+ * Destructs services that are initiated and tagged with "needs_destruction".
+ *
+ * @see \Drupal\Core\DestructableInterface
+ */
+class KernelDestructionSubscriber implements EventSubscriberInterface, ContainerAwareInterface {
+
+  use ContainerAwareTrait;
+  /**
+   * Holds an array of service ID's that will require destruction.
+   *
+   * @var array
+   */
+  protected $services = [];
+
+  /**
+   * Registers a service for destruction.
+   *
+   * Calls to this method are set up in
+   * RegisterServicesForDestructionPass::process().
+   *
+   * @param string $id
+   *   Name of the service.
+   */
+  public function registerService($id) {
+    $this->services[] = $id;
+  }
+
+  /**
+   * Invoked by the terminate kernel event.
+   *
+   * @param \Symfony\Component\HttpKernel\Event\PostResponseEvent $event
+   *   The event object.
+   */
+  public function onKernelTerminate(PostResponseEvent $event) {
+    foreach ($this->services as $id) {
+      // Check if the service was initialized during this request, destruction
+      // is not necessary if the service was not used.
+      if ($this->container->initialized($id)) {
+        $service = $this->container->get($id);
+        $service->destruct();
+      }
+    }
+  }
+
+  /**
+   * Registers the methods in this class that should be listeners.
+   *
+   * @return array
+   *   An array of event listener definitions.
+   */
+  public static function getSubscribedEvents() {
+    // Run this subscriber after others as those might use services that need
+    // to be terminated as well or run code that needs to run before
+    // termination.
+    $events[KernelEvents::TERMINATE][] = ['onKernelTerminate', -100];
+    return $events;
+  }
+
+}