From 778c9bd54c7b6092cc440b89e2d51f7c14c1399f Mon Sep 17 00:00:00 2001
From: Dave Long <dave@longwaveconsulting.com>
Date: Mon, 27 Jan 2025 23:03:52 +0000
Subject: [PATCH] Issue #3493595 by alexpott, amateescu: The
 mysql.views.cast_sql service depends on the views module and exists when
 views is not installed

---
 core/modules/mysql/mysql.services.yml         |  4 ---
 .../mysql/src/MysqlServiceProvider.php        | 25 +++++++++++++
 .../tests/src/Kernel/mysql/ViewsTest.php      | 36 +++++++++++++++++++
 core/modules/views/views.services.yml         |  1 +
 4 files changed, 62 insertions(+), 4 deletions(-)
 delete mode 100644 core/modules/mysql/mysql.services.yml
 create mode 100644 core/modules/mysql/src/MysqlServiceProvider.php
 create mode 100644 core/modules/mysql/tests/src/Kernel/mysql/ViewsTest.php

diff --git a/core/modules/mysql/mysql.services.yml b/core/modules/mysql/mysql.services.yml
deleted file mode 100644
index c20d7f1833c4..000000000000
--- a/core/modules/mysql/mysql.services.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-services:
-  mysql.views.cast_sql:
-    class: Drupal\mysql\Plugin\views\query\MysqlCastSql
-    public: false
diff --git a/core/modules/mysql/src/MysqlServiceProvider.php b/core/modules/mysql/src/MysqlServiceProvider.php
new file mode 100644
index 000000000000..8c1578e25827
--- /dev/null
+++ b/core/modules/mysql/src/MysqlServiceProvider.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Drupal\mysql;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\DependencyInjection\ServiceProviderBase;
+use Drupal\mysql\Plugin\views\query\MysqlCastSql;
+
+/**
+ * Registers the 'mysql.views.cast_sql' service when views is installed.
+ */
+class MysqlServiceProvider extends ServiceProviderBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function register(ContainerBuilder $container): void {
+    if (isset($container->getParameter('container.modules')['views'])) {
+      $container
+        ->register('mysql.views.cast_sql', MysqlCastSql::class)
+        ->setPublic(FALSE);
+    }
+  }
+
+}
diff --git a/core/modules/mysql/tests/src/Kernel/mysql/ViewsTest.php b/core/modules/mysql/tests/src/Kernel/mysql/ViewsTest.php
new file mode 100644
index 000000000000..d2914692ce78
--- /dev/null
+++ b/core/modules/mysql/tests/src/Kernel/mysql/ViewsTest.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\mysql\Kernel\mysql;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\KernelTests\Core\Database\DriverSpecificDatabaseTestBase;
+use Drupal\mysql\Plugin\views\query\MysqlCastSql;
+
+/**
+ * Tests views service.
+ *
+ * @group Database
+ */
+class ViewsTest extends DriverSpecificDatabaseTestBase {
+
+  /**
+   * Tests views service.
+   */
+  public function testViewsService(): void {
+    $this->assertFalse($this->container->has('views.cast_sql'));
+    $this->enableModules(['views']);
+    $this->assertInstanceOf(MysqlCastSql::class, $this->container->get('views.cast_sql'));
+    $this->assertFalse($this->container->has('mysql.views.cast_sql'));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function register(ContainerBuilder $container): void {
+    parent::register($container);
+    $this->assertSame($container->hasDefinition('mysql.views.cast_sql'), isset($container->getParameter('container.modules')['views']));
+  }
+
+}
diff --git a/core/modules/views/views.services.yml b/core/modules/views/views.services.yml
index eb07ae249760..2a3aa1a16fad 100644
--- a/core/modules/views/views.services.yml
+++ b/core/modules/views/views.services.yml
@@ -106,3 +106,4 @@ services:
     class: Drupal\views\Plugin\views\query\CastSql
     tags:
       - { name: backend_overridable }
+  Drupal\views\Plugin\views\query\CastSqlInterface: '@views.cast_sql'
-- 
GitLab