From 4a8aaa4a9ca349936d05f87cc09f49ef8af793ec Mon Sep 17 00:00:00 2001
From: Dave Long <dave@longwaveconsulting.com>
Date: Tue, 12 Nov 2024 09:18:41 +0000
Subject: [PATCH] Issue #3485296 by bradjones1, longwave, alexpott: Regression:
 Deprecation of `yaml_parser_class` setting in 10.3 breaks sites < 11.0

---
 core/.deprecation-ignore.txt                  |  4 ++++
 .../scaffold/files/default.settings.php       |  2 ++
 core/lib/Drupal/Core/Serialization/Yaml.php   | 22 ++++++++++++++++---
 sites/default/default.settings.php            |  2 ++
 4 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/core/.deprecation-ignore.txt b/core/.deprecation-ignore.txt
index 3c1c894cf17d..c2720827823c 100644
--- a/core/.deprecation-ignore.txt
+++ b/core/.deprecation-ignore.txt
@@ -49,6 +49,10 @@
 %Drupal\\editor\\Form\\EditorImageDialog is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. There is no replacement. See https://www.drupal.org/node/3291493%
 %Drupal\\editor\\Form\\EditorLinkDialog is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. There is no replacement. See https://www.drupal.org/node/3291493%
 
+# In Drupal 10, skip deprecations for the "yaml_parser_class" setting.
+# This is retained with a BC layer, but removed in Drupal 11.
+%The "yaml_parser_class" setting is deprecated in drupal:10.3.0. This setting should be removed from the settings file, since its usage has been removed. See https://www.drupal.org/node/3415489.%
+
 # Symfony 7.
 %Method "Symfony\\Contracts\\Service\\ResetInterface::reset\(\)" might add "void" as a native return type declaration in the future. Do the same in implementation "Drupal\\Component\\DependencyInjection\\Container" now to avoid errors or add an explicit @return annotation to suppress this message.%
 
diff --git a/core/assets/scaffold/files/default.settings.php b/core/assets/scaffold/files/default.settings.php
index 264597b163ba..90883ff469b6 100644
--- a/core/assets/scaffold/files/default.settings.php
+++ b/core/assets/scaffold/files/default.settings.php
@@ -730,6 +730,8 @@
  * Provide a fully qualified class name here if you would like to provide an
  * alternate implementation YAML parser. The class must implement the
  * \Drupal\Component\Serialization\SerializationInterface interface.
+ *
+ * This setting is deprecated in Drupal 10.3 and removed in Drupal 11.
  */
 # $settings['yaml_parser_class'] = NULL;
 
diff --git a/core/lib/Drupal/Core/Serialization/Yaml.php b/core/lib/Drupal/Core/Serialization/Yaml.php
index 564fdac993d4..6e7b37cf7a8d 100644
--- a/core/lib/Drupal/Core/Serialization/Yaml.php
+++ b/core/lib/Drupal/Core/Serialization/Yaml.php
@@ -1,7 +1,23 @@
 <?php
-// phpcs:ignoreFile
+
+namespace Drupal\Core\Serialization;
+
+use Drupal\Core\Site\Settings;
+use Drupal\Component\Serialization\Yaml as ComponentYaml;
 
 /**
- * Provides a BC layer for Drupal\Core\Serialization\Yaml.
+ * Provides a YAML serialization implementation.
+ *
+ * Allow settings to override the YAML implementation resolution.
  */
-class_alias('\Drupal\Component\Serialization\Yaml', '\Drupal\Core\Serialization\Yaml');
+class Yaml extends ComponentYaml {
+
+  public static function decode($raw) {
+    if ($class = Settings::get('yaml_parser_class')) {
+      return $class::decode($raw);
+    }
+
+    return parent::decode($raw);
+  }
+
+}
diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php
index 264597b163ba..90883ff469b6 100644
--- a/sites/default/default.settings.php
+++ b/sites/default/default.settings.php
@@ -730,6 +730,8 @@
  * Provide a fully qualified class name here if you would like to provide an
  * alternate implementation YAML parser. The class must implement the
  * \Drupal\Component\Serialization\SerializationInterface interface.
+ *
+ * This setting is deprecated in Drupal 10.3 and removed in Drupal 11.
  */
 # $settings['yaml_parser_class'] = NULL;
 
-- 
GitLab