Civi\Core\Container - Simplify handling of `bootServices` using `setSynthetic()`
authorTim Otten <totten@civicrm.org>
Wed, 10 Feb 2016 01:36:16 +0000 (17:36 -0800)
committerTim Otten <totten@civicrm.org>
Mon, 15 Feb 2016 22:23:50 +0000 (14:23 -0800)
`bootServices` are services that must be setup before the container can be
instantiated -- but which should be available through the container.

We had been using some work-arounds with factory functions to get this
effect, but this was fairly verbose.  It's simpler to use the
`setSynthetic()` option.

Civi/Core/Container.php

index 3a443f3759eb422fc2503693f5e4ab89100f5fbb..e8d71486bb1c29f2a38ed206d865d97e2145a420 100644 (file)
@@ -174,9 +174,7 @@ class Container {
       throw new \RuntimeException("Cannot initialize container. Boot services are undefined.");
     }
     foreach (\Civi::$statics[__CLASS__]['boot'] as $bootService => $def) {
-      $container->setDefinition($bootService, new Definition($def['class'], array($bootService)))
-        ->setFactoryClass(__CLASS__)
-        ->setFactoryMethod('getBootService');
+      $container->setDefinition($bootService, new Definition())->setSynthetic(TRUE);
     }
 
     // Expose legacy singletons as services in the container.
@@ -329,51 +327,30 @@ class Container {
    * @throws \CRM_Core_Exception
    */
   public static function boot($loadFromDB) {
+    // Array(string $serviceId => object $serviceInstance).
     $bootServices = array();
     \Civi::$statics[__CLASS__]['boot'] = &$bootServices;
 
-    $bootServices['runtime'] = array(
-      'class' => 'CRM_Core_Config_Runtime',
-      'obj' => ($runtime = new \CRM_Core_Config_Runtime()),
-    );
+    $bootServices['runtime'] = $runtime = new \CRM_Core_Config_Runtime();
     $runtime->initialize($loadFromDB);
 
-    $bootServices['paths'] = array(
-      'class' => 'Civi\Core\Paths',
-      'obj' => new \Civi\Core\Paths(),
-    );
+    $bootServices['paths'] = new \Civi\Core\Paths();
 
     $class = $runtime->userFrameworkClass;
-    $bootServices['userSystem'] = array(
-      'class' => 'CRM_Utils_Cache_Interface',
-      'obj' => ($userSystem = new $class()),
-    );
+    $bootServices['userSystem'] = $userSystem = new $class();
     $userSystem->initialize();
 
     $userPermissionClass = 'CRM_Core_Permission_' . $runtime->userFramework;
-    $bootServices['userPermissionClass'] = array(
-      // Ugh, silly name.
-      'class' => 'CRM_Core_Permission_Base',
-      'obj' => new $userPermissionClass(),
-    );
+    $bootServices['userPermissionClass'] = new $userPermissionClass();
 
-    $bootServices['cache.settings'] = array(
-      'class' => 'CRM_Utils_Cache_Interface',
-      'obj' => \CRM_Utils_Cache::create(array(
-        'name' => 'settings',
-        'type' => array('*memory*', 'SqlGroup', 'ArrayCache'),
-      )),
-    );
+    $bootServices['cache.settings'] = \CRM_Utils_Cache::create(array(
+      'name' => 'settings',
+      'type' => array('*memory*', 'SqlGroup', 'ArrayCache'),
+    ));
 
-    $bootServices['settings_manager'] = array(
-      'class' => 'Civi\Core\SettingsManager',
-      'obj' => new \Civi\Core\SettingsManager($bootServices['cache.settings']['obj']),
-    );
+    $bootServices['settings_manager'] = new \Civi\Core\SettingsManager($bootServices['cache.settings']);
 
-    $bootServices['lockManager'] = array(
-      'class' => 'Civi\Core\Lock\LockManager',
-      'obj' => self::createLockManager(),
-    );
+    $bootServices['lockManager'] = self::createLockManager();
 
     if ($loadFromDB && $runtime->dsn) {
       \CRM_Core_DAO::init($runtime->dsn);
@@ -382,12 +359,16 @@ class Container {
       \CRM_Extension_System::singleton(TRUE)->getClassLoader()->register();
 
       $c = new self();
-      \Civi::$statics[__CLASS__]['container'] = $c->loadContainer();
+      $container = $c->loadContainer();
+      foreach ($bootServices as $name => $obj) {
+        $container->set($name, $obj);
+      }
+      \Civi::$statics[__CLASS__]['container'] = $container;
     }
   }
 
   public static function getBootService($name) {
-    return \Civi::$statics[__CLASS__]['boot'][$name]['obj'];
+    return \Civi::$statics[__CLASS__]['boot'][$name];
   }
 
 }