Commit | Line | Data |
---|---|---|
fa184193 TO |
1 | <?php |
2 | namespace Civi\Core; | |
46bcf597 | 3 | |
10760fa1 | 4 | use Civi\Core\Lock\LockManager; |
fa184193 TO |
5 | use Doctrine\Common\Annotations\AnnotationReader; |
6 | use Doctrine\Common\Annotations\AnnotationRegistry; | |
7 | use Doctrine\Common\Annotations\FileCacheReader; | |
8 | use Doctrine\Common\Cache\FilesystemCache; | |
9 | use Doctrine\ORM\EntityManager; | |
10 | use Doctrine\ORM\Mapping\Driver\AnnotationDriver; | |
11 | use Doctrine\ORM\Tools\Setup; | |
12 | use Symfony\Component\DependencyInjection\ContainerBuilder; | |
c8074a93 | 13 | use Symfony\Component\DependencyInjection\ContainerInterface; |
fa184193 TO |
14 | use Symfony\Component\DependencyInjection\Definition; |
15 | use Symfony\Component\DependencyInjection\Reference; | |
16 | ||
17 | // TODO use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; | |
18 | ||
6550386a EM |
19 | /** |
20 | * Class Container | |
21 | * @package Civi\Core | |
22 | */ | |
fa184193 TO |
23 | class Container { |
24 | ||
25 | const SELF = 'civi_container_factory'; | |
26 | ||
27 | /** | |
28 | * @var ContainerBuilder | |
29 | */ | |
30 | private static $singleton; | |
31 | ||
32 | /** | |
04855556 TO |
33 | * @param bool $reset |
34 | * Whether to forcibly rebuild the entire container. | |
fa184193 TO |
35 | * @return \Symfony\Component\DependencyInjection\TaggedContainerInterface |
36 | */ | |
378e2654 TO |
37 | public static function singleton($reset = FALSE) { |
38 | if ($reset || self::$singleton === NULL) { | |
fa184193 TO |
39 | $c = new self(); |
40 | self::$singleton = $c->createContainer(); | |
41 | } | |
42 | return self::$singleton; | |
43 | } | |
44 | ||
45 | /** | |
46 | * @var ContainerBuilder | |
77b97be7 | 47 | * @return \Symfony\Component\DependencyInjection\ContainerBuilder |
fa184193 TO |
48 | */ |
49 | public function createContainer() { | |
50 | $civicrm_base_path = dirname(dirname(__DIR__)); | |
51 | $container = new ContainerBuilder(); | |
52 | $container->setParameter('civicrm_base_path', $civicrm_base_path); | |
53 | $container->set(self::SELF, $this); | |
54 | ||
505d8b83 TO |
55 | // TODO Move configuration to an external file; define caching structure |
56 | // if (empty($configDirectories)) { | |
57 | // throw new \Exception(__CLASS__ . ': Missing required properties (civicrmRoot, configDirectories)'); | |
58 | // } | |
59 | // $locator = new FileLocator($configDirectories); | |
60 | // $loaderResolver = new LoaderResolver(array( | |
61 | // new YamlFileLoader($container, $locator) | |
62 | // )); | |
63 | // $delegatingLoader = new DelegatingLoader($loaderResolver); | |
64 | // foreach (array('services.yml') as $file) { | |
65 | // $yamlUserFiles = $locator->locate($file, NULL, FALSE); | |
66 | // foreach ($yamlUserFiles as $file) { | |
67 | // $delegatingLoader->load($file); | |
68 | // } | |
69 | // } | |
fa184193 | 70 | |
10760fa1 TO |
71 | $container->setDefinition('lockManager', new Definition( |
72 | '\Civi\Core\Lock\LockManager', | |
73 | array() | |
74 | )) | |
75 | ->setFactoryService(self::SELF)->setFactoryMethod('createLockManager'); | |
76 | ||
16072ce1 TO |
77 | $container->setDefinition('angular', new Definition( |
78 | '\Civi\Angular\Manager', | |
79 | array() | |
80 | )) | |
81 | ->setFactoryService(self::SELF)->setFactoryMethod('createAngularManager'); | |
82 | ||
fa184193 TO |
83 | $container->setDefinition('dispatcher', new Definition( |
84 | '\Symfony\Component\EventDispatcher\EventDispatcher', | |
85 | array() | |
86 | )) | |
87 | ->setFactoryService(self::SELF)->setFactoryMethod('createEventDispatcher'); | |
88 | ||
c65db512 TO |
89 | $container->setDefinition('magic_function_provider', new Definition( |
90 | '\Civi\API\Provider\MagicFunctionProvider', | |
91 | array() | |
92 | )); | |
93 | ||
0f643fb2 TO |
94 | $container->setDefinition('civi_api_kernel', new Definition( |
95 | '\Civi\API\Kernel', | |
c65db512 | 96 | array(new Reference('dispatcher'), new Reference('magic_function_provider')) |
0f643fb2 TO |
97 | )) |
98 | ->setFactoryService(self::SELF)->setFactoryMethod('createApiKernel'); | |
99 | ||
7b4bbb34 TO |
100 | $container->setDefinition('cxn_reg_client', new Definition( |
101 | '\Civi\Cxn\Rpc\RegistrationClient', | |
102 | array() | |
103 | )) | |
9ae2d27b | 104 | ->setFactoryClass('CRM_Cxn_BAO_Cxn')->setFactoryMethod('createRegistrationClient'); |
7b4bbb34 | 105 | |
247eb841 TO |
106 | $container->setDefinition('pear_mail', new Definition('Mail')) |
107 | ->setFactoryClass('CRM_Utils_Mail')->setFactoryMethod('createMailer'); | |
108 | ||
c8074a93 TO |
109 | // Expose legacy singletons as services in the container. |
110 | $singletons = array( | |
111 | 'resources' => 'CRM_Core_Resources', | |
112 | 'httpClient' => 'CRM_Utils_HttpClient', | |
113 | // Maybe? 'config' => 'CRM_Core_Config', | |
114 | // Maybe? 'smarty' => 'CRM_Core_Smarty', | |
115 | ); | |
116 | foreach ($singletons as $name => $class) { | |
117 | $container->setDefinition($name, new Definition( | |
118 | $class | |
119 | )) | |
120 | ->setFactoryClass($class)->setFactoryMethod('singleton'); | |
121 | } | |
122 | ||
fa184193 TO |
123 | return $container; |
124 | } | |
125 | ||
16072ce1 TO |
126 | /** |
127 | * @return \Civi\Angular\Manager | |
128 | */ | |
129 | public function createAngularManager() { | |
130 | return new \Civi\Angular\Manager(\CRM_Core_Resources::singleton()); | |
131 | } | |
132 | ||
fa184193 TO |
133 | /** |
134 | * @return \Symfony\Component\EventDispatcher\EventDispatcher | |
135 | */ | |
136 | public function createEventDispatcher() { | |
137 | $dispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher(); | |
708d8fa2 | 138 | $dispatcher->addListener('hook_civicrm_post::Activity', array('\Civi\CCase\Events', 'fireCaseChange')); |
753657ed | 139 | $dispatcher->addListener('hook_civicrm_post::Case', array('\Civi\CCase\Events', 'fireCaseChange')); |
708d8fa2 | 140 | $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\Events', 'delegateToXmlListeners')); |
b019b130 | 141 | $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\SequenceListener', 'onCaseChange_static')); |
8498c2b7 | 142 | $dispatcher->addListener('DAO::post-insert', array('\CRM_Core_BAO_RecurringEntity', 'triggerInsert')); |
143 | $dispatcher->addListener('DAO::post-update', array('\CRM_Core_BAO_RecurringEntity', 'triggerUpdate')); | |
144 | $dispatcher->addListener('DAO::post-delete', array('\CRM_Core_BAO_RecurringEntity', 'triggerDelete')); | |
46bcf597 | 145 | $dispatcher->addListener('hook_civicrm_unhandled_exception', array( |
9ae2d27b TO |
146 | 'CRM_Core_LegacyErrorHandler', |
147 | 'handleException', | |
148 | )); | |
fa184193 TO |
149 | return $dispatcher; |
150 | } | |
0f643fb2 | 151 | |
10760fa1 TO |
152 | /** |
153 | * @return LockManager | |
154 | */ | |
155 | public function createLockManager() { | |
156 | // Ideally, downstream implementers could override any definitions in | |
157 | // the container. For now, we'll make-do with some define()s. | |
158 | $lm = new LockManager(); | |
159 | $lm | |
160 | ->register('/^cache\./', defined('CIVICRM_CACHE_LOCK') ? CIVICRM_CACHE_LOCK : array('CRM_Core_Lock', 'createScopedLock')) | |
161 | ->register('/^data\./', defined('CIVICRM_DATA_LOCK') ? CIVICRM_DATA_LOCK : array('CRM_Core_Lock', 'createScopedLock')) | |
162 | ->register('/^worker\.mailing\.send\./', defined('CIVICRM_WORK_LOCK') ? CIVICRM_WORK_LOCK : array('CRM_Core_Lock', 'createCivimailLock')) | |
163 | ->register('/^worker\./', defined('CIVICRM_WORK_LOCK') ? CIVICRM_WORK_LOCK : array('CRM_Core_Lock', 'createScopedLock')); | |
164 | ||
165 | // Registrations may use complex resolver expressions, but (as a micro-optimization) | |
166 | // the default factory is specified as an array. | |
167 | ||
168 | return $lm; | |
169 | } | |
170 | ||
0f643fb2 TO |
171 | /** |
172 | * @param \Symfony\Component\EventDispatcher\EventDispatcher $dispatcher | |
2a6da8d7 EM |
173 | * @param $magicFunctionProvider |
174 | * | |
0f643fb2 TO |
175 | * @return \Civi\API\Kernel |
176 | */ | |
c65db512 | 177 | public function createApiKernel($dispatcher, $magicFunctionProvider) { |
0a946de2 | 178 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\ChainSubscriber()); |
b55bc593 | 179 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\TransactionSubscriber()); |
bace5cd9 | 180 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\I18nSubscriber()); |
c65db512 | 181 | $dispatcher->addSubscriber($magicFunctionProvider); |
d0c9daa4 | 182 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\PermissionCheck()); |
dcef11bd | 183 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\APIv3SchemaAdapter()); |
6d3bdc98 TO |
184 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\WrapperAdapter(array( |
185 | \CRM_Utils_API_HTMLInputCoder::singleton(), | |
186 | \CRM_Utils_API_NullOutputCoder::singleton(), | |
187 | \CRM_Utils_API_ReloadOption::singleton(), | |
188 | \CRM_Utils_API_MatchOption::singleton(), | |
189 | ))); | |
0661f62b | 190 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\XDebugSubscriber()); |
82376c19 TO |
191 | $kernel = new \Civi\API\Kernel($dispatcher); |
192 | ||
193 | $reflectionProvider = new \Civi\API\Provider\ReflectionProvider($kernel); | |
194 | $dispatcher->addSubscriber($reflectionProvider); | |
195 | ||
56154d36 TO |
196 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\DynamicFKAuthorization( |
197 | $kernel, | |
198 | 'Attachment', | |
199 | array('create', 'get', 'delete'), | |
2e37a19f | 200 | // Given a file ID, determine the entity+table it's attached to. |
56154d36 TO |
201 | 'SELECT if(cf.id,1,0) as is_valid, cef.entity_table, cef.entity_id |
202 | FROM civicrm_file cf | |
203 | LEFT JOIN civicrm_entity_file cef ON cf.id = cef.file_id | |
204 | WHERE cf.id = %1', | |
29468114 TO |
205 | // Get a list of custom fields (field_name,table_name,extends) |
206 | 'SELECT concat("custom_",fld.id) as field_name, | |
207 | grp.table_name as table_name, | |
208 | grp.extends as extends | |
209 | FROM civicrm_custom_field fld | |
210 | INNER JOIN civicrm_custom_group grp ON fld.custom_group_id = grp.id | |
211 | WHERE fld.data_type = "File" | |
212 | ', | |
e3e66815 | 213 | array('civicrm_activity', 'civicrm_mailing', 'civicrm_contact', 'civicrm_grant') |
56154d36 TO |
214 | )); |
215 | ||
82376c19 TO |
216 | $kernel->setApiProviders(array( |
217 | $reflectionProvider, | |
218 | $magicFunctionProvider, | |
219 | )); | |
220 | ||
0f643fb2 TO |
221 | return $kernel; |
222 | } | |
96025800 | 223 | |
fa184193 | 224 | } |