(dev/core#217) PrevNext - Probe for best available implementation (memory-backed...
authorTim Otten <totten@civicrm.org>
Mon, 9 Jul 2018 00:54:07 +0000 (17:54 -0700)
committerTim Otten <totten@civicrm.org>
Tue, 24 Jul 2018 01:19:53 +0000 (18:19 -0700)
Before
------

The `prevnext` service is always an instance of `CRM_Core_PrevNextCache_Sql`.

After
-----

If you define `CIVICRM_DB_CACHE_CLASS`, and if there's a corresponding
service `prevnext.driver.{mydriver}`, then it will use that service.

Otherwise, it will use `prevnext.driver.sql` (`CRM_Core_PrevNextCache_Sql`).

Civi/Core/Container.php

index 30107af67ba5103535e65ac463286a2811ce83a2..6eb4a4d66a9f8a8a93fbb737cc95a3e77d21029f 100644 (file)
@@ -215,6 +215,11 @@ class Container {
     }
 
     $container->setDefinition('prevnext', new Definition(
+      'CRM_Core_PrevNextCache_Interface',
+      [new Reference('service_container')]
+    ))->setFactory(array(new Reference(self::SELF), 'createPrevNextCache'));
+
+    $container->setDefinition('prevnext.driver.sql', new Definition(
       'CRM_Core_PrevNextCache_Sql',
       []
     ));
@@ -404,6 +409,18 @@ class Container {
     return $kernel;
   }
 
+  /**
+   * @param ContainerInterface $container
+   * @return \CRM_Core_PrevNextCache_Interface
+   */
+  public static function createPrevNextCache($container) {
+    $cacheDriver = \CRM_Utils_Cache::getCacheDriver();
+    $service = 'prevnext.driver.' . strtolower($cacheDriver);
+    return $container->has($service)
+      ? $container->get($service)
+      : $container->get('prevnext.driver.sql');
+  }
+
   /**
    * Get a list of boot services.
    *