CRM-16373 - Bootstrap subsystems in more predictable order
[civicrm-core.git] / Civi.php
CommitLineData
711aa5d7
TO
1<?php
2
3/**
4 * Class Civi
5 *
6 * The "Civi" class provides a facade for accessing major subsystems,
7 * such as the service-container and settings manager. It serves as a
8 * bridge which allows procedural code to access important objects.
9 *
10 * General principles:
11 * - Each function provides access to a major subsystem.
12 * - Each function performs a simple lookup.
13 * - Each function returns an interface.
14 * - Whenever possible, interfaces should be well-known (e.g. based
15 * on a standard or well-regarded provider).
16 */
17class Civi {
18
19 /**
20 * A central location for static variable storage.
21 *
22 * @code
23 * `Civi::$statics[__CLASS__]['foo'] = 'bar';
24 * @endcode
25 */
26 public static $statics = array();
27
7b5937fe
TO
28 /**
29 * EXPERIMENTAL. Retrieve a named cache instance.
30 *
31 * This interface is flagged as experimental due to political
32 * ambiguity in PHP community -- PHP-FIG has an open but
33 * somewhat controversial draft standard for caching. Based on
34 * the current draft, it's expected that this function could
35 * simultaneously support both CRM_Utils_Cache_Interface and
36 * PSR-6, but that depends on whether PSR-6 changes any more.
37 *
38 * @param string $name
39 * The name of the cache. The 'default' cache is biased toward
40 * high-performance caches (eg memcache/redis/apc) when
41 * available and falls back to single-request (static) caching.
42 * @return CRM_Utils_Cache_Interface
43 */
44 public static function cache($name = 'default') {
45 return \Civi\Core\Container::singleton()->get('cache.' . $name);
46 }
47
711aa5d7
TO
48 /**
49 * Get the service container.
50 *
51 * @return \Symfony\Component\DependencyInjection\ContainerInterface
52 */
53 public static function container() {
54 return Civi\Core\Container::singleton();
55 }
56
83617886
TO
57 /**
58 * @return \Civi\Core\Lock\LockManager
59 */
60 public static function lockManager() {
61 return \Civi\Core\Container::getBootService('lockManager');
62 }
63
6e5ad5ee
TO
64 /**
65 * @return \Psr\Log\LoggerInterface
66 */
67 public static function log() {
68 return Civi\Core\Container::singleton()->get('psr_log');
69 }
70
e3d28c74
TO
71 /**
72 * Obtain the core file/path mapper.
73 *
74 * @return \Civi\Core\Paths
75 */
76 public static function paths() {
77 // Paths must be available before container can boot.
78 if (!isset(Civi::$statics[__CLASS__]['paths'])) {
79 Civi::$statics[__CLASS__]['paths'] = new \Civi\Core\Paths();
80 }
81 return Civi::$statics[__CLASS__]['paths'];
82 }
83
711aa5d7
TO
84 /**
85 * Fetch a service from the container.
86 *
87 * @param string $id
88 * The service ID.
89 * @return mixed
90 */
91 public static function service($id) {
92 return \Civi\Core\Container::singleton()->get($id);
93 }
94
95 /**
96 * Reset all ephemeral system state, e.g. statics,
97 * singletons, containers.
98 */
99 public static function reset() {
711aa5d7 100 self::$statics = array();
83617886
TO
101 Civi\Core\Container::getBootServices();
102 Civi\Core\Container::singleton(TRUE);
711aa5d7
TO
103 }
104
e3d28c74
TO
105 /**
106 * @return CRM_Core_Resources
107 */
108 public static function resources() {
109 return CRM_Core_Resources::singleton();
110 }
111
3a84c0ab
TO
112 /**
113 * Obtain the domain settings.
114 *
115 * @param int|null $domainID
116 * For the default domain, leave $domainID as NULL.
117 * @return \Civi\Core\SettingsBag
118 */
119 public static function settings($domainID = NULL) {
83617886 120 return \Civi\Core\Container::getBootService('settings_manager')->getBagByDomain($domainID);
3a84c0ab
TO
121 }
122
711aa5d7 123}