Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / web / core / lib / Drupal / Core / Messenger / LegacyMessenger.php
diff --git a/web/core/lib/Drupal/Core/Messenger/LegacyMessenger.php b/web/core/lib/Drupal/Core/Messenger/LegacyMessenger.php
new file mode 100644 (file)
index 0000000..ff323d2
--- /dev/null
@@ -0,0 +1,191 @@
+<?php
+
+namespace Drupal\Core\Messenger;
+
+use Drupal\Component\Render\MarkupInterface;
+use Drupal\Core\Render\Markup;
+
+/**
+ * Provides a LegacyMessenger implementation.
+ *
+ * This implementation is for handling messages in a backwards compatible way
+ * using core's previous $_SESSION storage method.
+ *
+ * You should not instantiate a new instance of this class directly. Instead,
+ * you should inject the "messenger" service into your own services or use
+ * \Drupal::messenger() in procedural functions.
+ *
+ * @see https://www.drupal.org/node/2774931
+ * @see https://www.drupal.org/node/2928994
+ *
+ * @deprecated in Drupal 8.5.0 and will be removed before Drupal 9.0.0.
+ *   Use \Drupal\Core\Messenger\Messenger instead.
+ */
+class LegacyMessenger implements MessengerInterface {
+
+  /**
+   * The messages.
+   *
+   * Note: this property must remain static because it must behave in a
+   * persistent manner, similar to $_SESSION['messages']. Creating a new class
+   * each time would destroy any previously set messages.
+   *
+   * @var array
+   */
+  protected static $messages;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function addError($message, $repeat = FALSE) {
+    return $this->addMessage($message, static::TYPE_ERROR, $repeat);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function addMessage($message, $type = self::TYPE_STATUS, $repeat = FALSE) {
+    // Proxy to the Messenger service, if it exists.
+    if ($messenger = $this->getMessengerService()) {
+      return $messenger->addMessage($message, $type, $repeat);
+    }
+
+    if (!isset(static::$messages[$type])) {
+      static::$messages[$type] = [];
+    }
+
+    if (!($message instanceof Markup) && $message instanceof MarkupInterface) {
+      $message = Markup::create((string) $message);
+    }
+
+    // Do not use strict type checking so that equivalent string and
+    // MarkupInterface objects are detected.
+    if ($repeat || !in_array($message, static::$messages[$type])) {
+      static::$messages[$type][] = $message;
+    }
+
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function addStatus($message, $repeat = FALSE) {
+    return $this->addMessage($message, static::TYPE_STATUS, $repeat);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function addWarning($message, $repeat = FALSE) {
+    return $this->addMessage($message, static::TYPE_WARNING, $repeat);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function all() {
+    // Proxy to the Messenger service, if it exists.
+    if ($messenger = $this->getMessengerService()) {
+      return $messenger->all();
+    }
+
+    return static::$messages;
+  }
+
+  /**
+   * Returns the Messenger service.
+   *
+   * @return \Drupal\Core\Messenger\MessengerInterface|null
+   *   The Messenger service.
+   */
+  protected function getMessengerService() {
+    // Use the Messenger service, if it exists.
+    if (\Drupal::hasService('messenger')) {
+      // Note: because the container has the potential to be rebuilt during
+      // requests, this service cannot be directly stored on this class.
+      /** @var \Drupal\Core\Messenger\MessengerInterface $messenger */
+      $messenger = \Drupal::service('messenger');
+
+      // Transfer any messages into the service.
+      if (isset(static::$messages)) {
+        foreach (static::$messages as $type => $messages) {
+          foreach ($messages as $message) {
+            // Force repeat to TRUE since this is merging existing messages to
+            // the Messenger service and would have already checked this prior.
+            $messenger->addMessage($message, $type, TRUE);
+          }
+        }
+        static::$messages = NULL;
+      }
+
+      return $messenger;
+    }
+
+    // Otherwise, trigger an error.
+    @trigger_error('Adding or retrieving messages prior to the container being initialized was deprecated in Drupal 8.5.0 and this functionality will be removed before Drupal 9.0.0. Please report this usage at https://www.drupal.org/node/2928994.', E_USER_DEPRECATED);
+
+    // Prematurely creating $_SESSION['messages'] in this class' constructor
+    // causes issues when the container attempts to initialize its own session
+    // later down the road. This can only be done after it has been determined
+    // the Messenger service is not available (i.e. no container). It is also
+    // reasonable to assume that if the container becomes available in a
+    // subsequent request, a new instance of this class will be created and
+    // this code will never be reached. This is merely for BC purposes.
+    if (!isset(static::$messages)) {
+      // A "session" was already created, perhaps to simply allow usage of
+      // the previous method core used to store messages, use it.
+      if (isset($_SESSION)) {
+        if (!isset($_SESSION['messages'])) {
+          $_SESSION['messages'] = [];
+        }
+        static::$messages = &$_SESSION['messages'];
+      }
+      // Otherwise, just set an empty array.
+      else {
+        static::$messages = [];
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function messagesByType($type) {
+    // Proxy to the Messenger service, if it exists.
+    if ($messenger = $this->getMessengerService()) {
+      return $messenger->messagesByType($type);
+    }
+
+    return static::$messages[$type];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function deleteAll() {
+    // Proxy to the Messenger service, if it exists.
+    if ($messenger = $this->getMessengerService()) {
+      return $messenger->deleteAll();
+    }
+
+    $messages = static::$messages;
+    static::$messages = NULL;
+    return $messages;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function deleteByType($type) {
+    // Proxy to the Messenger service, if it exists.
+    if ($messenger = $this->getMessengerService()) {
+      return $messenger->messagesByType($type);
+    }
+
+    $messages = static::$messages[$type];
+    unset(static::$messages[$type]);
+    return $messages;
+  }
+
+}