From fc90d0c8990f3eb7ff861f557373aa8caf38106b Mon Sep 17 00:00:00 2001
From: catch <catch@35733.no-reply.drupal.org>
Date: Thu, 13 Jan 2022 14:45:58 +0000
Subject: [PATCH] =?UTF-8?q?Issue=20#2979588=20by=20longwave,=20alexpott,?=
 =?UTF-8?q?=20Erik=20Fr=C3=A8rejean,=20catch,=20daffie:=20Deprecate=20Lami?=
 =?UTF-8?q?nas\Feed=20reader=20and=20writer=20services?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 core/core.services.yml                        | 21 +++++++++++
 .../Bridge/ZfExtensionManagerSfContainer.php  | 16 +++-----
 .../KernelTests/Core/LegacyServiceTest.php    | 37 +++++++++++++++++++
 .../ZfExtensionManagerSfContainerTest.php     |  4 +-
 4 files changed, 65 insertions(+), 13 deletions(-)

diff --git a/core/core.services.yml b/core/core.services.yml
index 64c718494fe7..14ccefa913fd 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -1453,67 +1453,88 @@ services:
   feed.reader.dublincoreentry:
     class: Laminas\Feed\Reader\Extension\DublinCore\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.reader')->get('DublinCore\Entry') instead. See https://www.drupal.org/node/2979042
   feed.reader.dublincorefeed:
     class: Laminas\Feed\Reader\Extension\DublinCore\Feed
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.reader')->get('DublinCore\Feed') instead. See https://www.drupal.org/node/2979042
   feed.reader.contententry:
     class: Laminas\Feed\Reader\Extension\Content\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.reader')->get('Content\Entry') instead. See https://www.drupal.org/node/2979042
   feed.reader.atomentry:
     class: Laminas\Feed\Reader\Extension\Atom\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.reader')->get('Atom\Entry') instead. See https://www.drupal.org/node/2979042
   feed.reader.atomfeed:
     class: Laminas\Feed\Reader\Extension\Atom\Feed
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.reader')->get('Atom\Feed') instead. See https://www.drupal.org/node/2979042
   feed.reader.slashentry:
     class: Laminas\Feed\Reader\Extension\Slash\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.reader')->get('Slash\Entry') instead. See https://www.drupal.org/node/2979042
   feed.reader.wellformedwebentry:
     class: Laminas\Feed\Reader\Extension\WellFormedWeb\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.reader')->get('WellFormedWeb\Entry') instead. See https://www.drupal.org/node/2979042
   feed.reader.threadentry:
     class: Laminas\Feed\Reader\Extension\Thread\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.reader')->get('Thread\Entry') instead. See https://www.drupal.org/node/2979042
   feed.reader.podcastentry:
     class: Laminas\Feed\Reader\Extension\Podcast\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.reader')->get('Podcast\Entry') instead. See https://www.drupal.org/node/2979042
   feed.reader.podcastfeed:
     class: Laminas\Feed\Reader\Extension\Podcast\Feed
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.reader')->get('Podcast\Feed') instead. See https://www.drupal.org/node/2979042
 # Laminas Feed writer plugins. Plugins should be set as prototype scope.
   feed.writer.atomrendererfeed:
     class: Laminas\Feed\Writer\Extension\Atom\Renderer\Feed
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.writer')->get('Atom\Renderer\Feed') instead. See https://www.drupal.org/node/2979042
   feed.writer.contentrendererentry:
     class: Laminas\Feed\Writer\Extension\Content\Renderer\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.writer')->get('Content\Renderer\Entry') instead. See https://www.drupal.org/node/2979042
   feed.writer.dublincorerendererentry:
     class: Laminas\Feed\Writer\Extension\DublinCore\Renderer\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.writer')->get('DublinCore\Renderer\Entry') instead. See https://www.drupal.org/node/2979042
   feed.writer.dublincorerendererfeed:
     class: Laminas\Feed\Writer\Extension\DublinCore\Renderer\Feed
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.writer')->get('DublinCore\Renderer\Feed') instead. See https://www.drupal.org/node/2979042
   feed.writer.itunesentry:
     class: Laminas\Feed\Writer\Extension\ITunes\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.writer')->get('ITunes\Entry') instead. See https://www.drupal.org/node/2979042
   feed.writer.itunesfeed:
     class: Laminas\Feed\Writer\Extension\ITunes\Feed
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.writer')->get('ITunes\Feed') instead. See https://www.drupal.org/node/2979042
   feed.writer.itunesrendererentry:
     class: Laminas\Feed\Writer\Extension\ITunes\Renderer\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.writer')->get('ITunes\Renderer\Entry') instead. See https://www.drupal.org/node/2979042
   feed.writer.itunesrendererfeed:
     class: Laminas\Feed\Writer\Extension\ITunes\Renderer\Feed
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.writer')->get('ITunes\Renderer\Feed') instead. See https://www.drupal.org/node/2979042
   feed.writer.slashrendererentry:
     class: Laminas\Feed\Writer\Extension\Slash\Renderer\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.writer')->get('Slash\Renderer\Entry') instead. See https://www.drupal.org/node/2979042
   feed.writer.threadingrendererentry:
     class: Laminas\Feed\Writer\Extension\Threading\Renderer\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.writer')->get('Threading\Renderer\Entry') instead. See https://www.drupal.org/node/2979042
   feed.writer.wellformedwebrendererentry:
     class: Laminas\Feed\Writer\Extension\WellFormedWeb\Renderer\Entry
     shared: false
+    deprecated: The "%service_id%" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \Drupal::service('feed.bridge.writer')->get('WellFormedWeb\Renderer\Entry') instead. See https://www.drupal.org/node/2979042
   theme.manager:
     class: Drupal\Core\Theme\ThemeManager
     arguments: ['%app.root%', '@theme.negotiator', '@theme.initialization', '@module_handler']
diff --git a/core/lib/Drupal/Component/Bridge/ZfExtensionManagerSfContainer.php b/core/lib/Drupal/Component/Bridge/ZfExtensionManagerSfContainer.php
index 2e9fdd310cf1..9e04ae9e4bf3 100644
--- a/core/lib/Drupal/Component/Bridge/ZfExtensionManagerSfContainer.php
+++ b/core/lib/Drupal/Component/Bridge/ZfExtensionManagerSfContainer.php
@@ -4,7 +4,6 @@
 
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
-use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
 use Laminas\Feed\Reader\ExtensionManagerInterface as ReaderManagerInterface;
 use Laminas\Feed\Writer\ExtensionManagerInterface as WriterManagerInterface;
 
@@ -69,25 +68,20 @@ public function __construct($prefix = '') {
    * {@inheritdoc}
    */
   public function get($extension) {
-    try {
-      return $this->container->get($this->prefix . $this->canonicalizeName($extension));
-    }
-    catch (ServiceNotFoundException $e) {
-      if ($this->standalone && $this->standalone->has($extension)) {
-        return $this->standalone->get($extension);
-      }
-      throw $e;
+    if ($this->standalone && $this->standalone->has($extension)) {
+      return $this->standalone->get($extension);
     }
+    return $this->container->get($this->prefix . $this->canonicalizeName($extension));
   }
 
   /**
    * {@inheritdoc}
    */
   public function has($extension) {
-    if ($this->container->has($this->prefix . $this->canonicalizeName($extension))) {
+    if ($this->standalone && $this->standalone->has($extension)) {
       return TRUE;
     }
-    return $this->standalone && $this->standalone->has($extension);
+    return $this->container->has($this->prefix . $this->canonicalizeName($extension));
   }
 
   /**
diff --git a/core/tests/Drupal/KernelTests/Core/LegacyServiceTest.php b/core/tests/Drupal/KernelTests/Core/LegacyServiceTest.php
index 5ec267b0180f..1967d6c4068d 100644
--- a/core/tests/Drupal/KernelTests/Core/LegacyServiceTest.php
+++ b/core/tests/Drupal/KernelTests/Core/LegacyServiceTest.php
@@ -30,4 +30,41 @@ public function testAppRoot() {
     $this->assertSame($this->container->get('app.root'), (string) $this->container->getParameter('app.root'));
   }
 
+  /**
+   * Tests the deprecated Laminas Feed services.
+   *
+   * @dataProvider providerLaminasFeedServices
+   */
+  public function testLaminasFeedServices($type, $service, $class) {
+    $service = "feed.$type.$service";
+    $this->expectDeprecation("The \"$service\" service is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. You should use \\Drupal::service('feed.bridge.$type')->get('$class') instead. See https://www.drupal.org/node/2979042");
+    $this->assertIsObject($this->container->get($service));
+  }
+
+  public function providerLaminasFeedServices() {
+    return [
+      ['reader', 'dublincoreentry', 'DublinCore\Entry'],
+      ['reader', 'dublincorefeed', 'DublinCore\Feed'],
+      ['reader', 'contententry', 'Content\Entry'],
+      ['reader', 'atomentry', 'Atom\Entry'],
+      ['reader', 'atomfeed', 'Atom\Feed'],
+      ['reader', 'slashentry', 'Slash\Entry'],
+      ['reader', 'wellformedwebentry', 'WellFormedWeb\Entry'],
+      ['reader', 'threadentry', 'Thread\Entry'],
+      ['reader', 'podcastentry', 'Podcast\Entry'],
+      ['reader', 'podcastfeed', 'Podcast\Feed'],
+      ['writer', 'atomrendererfeed', 'Atom\Renderer\Feed'],
+      ['writer', 'contentrendererentry', 'Content\Renderer\Entry'],
+      ['writer', 'dublincorerendererentry', 'DublinCore\Renderer\Entry'],
+      ['writer', 'dublincorerendererfeed', 'DublinCore\Renderer\Feed'],
+      ['writer', 'itunesentry', 'ITunes\Entry'],
+      ['writer', 'itunesfeed', 'ITunes\Feed'],
+      ['writer', 'itunesrendererentry', 'ITunes\Renderer\Entry'],
+      ['writer', 'itunesrendererfeed', 'ITunes\Renderer\Feed'],
+      ['writer', 'slashrendererentry', 'Slash\Renderer\Entry'],
+      ['writer', 'threadingrendererentry', 'Threading\Renderer\Entry'],
+      ['writer', 'wellformedwebrendererentry', 'WellFormedWeb\Renderer\Entry'],
+    ];
+  }
+
 }
diff --git a/core/tests/Drupal/Tests/Component/Bridge/ZfExtensionManagerSfContainerTest.php b/core/tests/Drupal/Tests/Component/Bridge/ZfExtensionManagerSfContainerTest.php
index 89603f95af3f..f3eae5919604 100644
--- a/core/tests/Drupal/Tests/Component/Bridge/ZfExtensionManagerSfContainerTest.php
+++ b/core/tests/Drupal/Tests/Component/Bridge/ZfExtensionManagerSfContainerTest.php
@@ -30,9 +30,9 @@ public function testGet() {
     $this->assertEquals($service, $bridge->get('foo'));
     $bridge->setStandalone(StandaloneExtensionManager::class);
     $this->assertInstanceOf(Entry::class, $bridge->get('Atom\Entry'));
-    // Ensure that the container is checked first.
+    // Ensure that the standalone service is checked before the container.
     $container->set('atomentry', $service);
-    $this->assertEquals($service, $bridge->get('Atom\Entry'));
+    $this->assertInstanceOf(Entry::class, $bridge->get('Atom\Entry'));
   }
 
   /**
-- 
GitLab