From 56eafc21948ae7f6c2cf4c313e081789465145b1 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Tue, 9 Feb 2016 17:36:16 -0800 Subject: [PATCH] Civi\Core\Container - Simplify handling of `bootServices` using `setSynthetic()` `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 | 55 ++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 37 deletions(-) diff --git a/Civi/Core/Container.php b/Civi/Core/Container.php index 3a443f3759..e8d71486bb 100644 --- a/Civi/Core/Container.php +++ b/Civi/Core/Container.php @@ -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]; } } -- 2.25.1