Commit | Line | Data |
---|---|---|
fa184193 TO |
1 | <?php |
2 | namespace Civi\Core; | |
46bcf597 | 3 | |
fa184193 TO |
4 | use Doctrine\Common\Annotations\AnnotationReader; |
5 | use Doctrine\Common\Annotations\AnnotationRegistry; | |
6 | use Doctrine\Common\Annotations\FileCacheReader; | |
7 | use Doctrine\Common\Cache\FilesystemCache; | |
8 | use Doctrine\ORM\EntityManager; | |
9 | use Doctrine\ORM\Mapping\Driver\AnnotationDriver; | |
10 | use Doctrine\ORM\Tools\Setup; | |
11 | use Symfony\Component\DependencyInjection\ContainerBuilder; | |
12 | use Symfony\Component\DependencyInjection\Definition; | |
13 | use Symfony\Component\DependencyInjection\Reference; | |
14 | ||
15 | // TODO use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; | |
16 | ||
6550386a EM |
17 | /** |
18 | * Class Container | |
19 | * @package Civi\Core | |
20 | */ | |
fa184193 TO |
21 | class Container { |
22 | ||
23 | const SELF = 'civi_container_factory'; | |
24 | ||
25 | /** | |
26 | * @var ContainerBuilder | |
27 | */ | |
28 | private static $singleton; | |
29 | ||
30 | /** | |
04855556 TO |
31 | * @param bool $reset |
32 | * Whether to forcibly rebuild the entire container. | |
fa184193 TO |
33 | * @return \Symfony\Component\DependencyInjection\TaggedContainerInterface |
34 | */ | |
378e2654 TO |
35 | public static function singleton($reset = FALSE) { |
36 | if ($reset || self::$singleton === NULL) { | |
fa184193 TO |
37 | $c = new self(); |
38 | self::$singleton = $c->createContainer(); | |
39 | } | |
40 | return self::$singleton; | |
41 | } | |
42 | ||
43 | /** | |
44 | * @var ContainerBuilder | |
77b97be7 | 45 | * @return \Symfony\Component\DependencyInjection\ContainerBuilder |
fa184193 TO |
46 | */ |
47 | public function createContainer() { | |
48 | $civicrm_base_path = dirname(dirname(__DIR__)); | |
49 | $container = new ContainerBuilder(); | |
50 | $container->setParameter('civicrm_base_path', $civicrm_base_path); | |
51 | $container->set(self::SELF, $this); | |
52 | ||
505d8b83 TO |
53 | // TODO Move configuration to an external file; define caching structure |
54 | // if (empty($configDirectories)) { | |
55 | // throw new \Exception(__CLASS__ . ': Missing required properties (civicrmRoot, configDirectories)'); | |
56 | // } | |
57 | // $locator = new FileLocator($configDirectories); | |
58 | // $loaderResolver = new LoaderResolver(array( | |
59 | // new YamlFileLoader($container, $locator) | |
60 | // )); | |
61 | // $delegatingLoader = new DelegatingLoader($loaderResolver); | |
62 | // foreach (array('services.yml') as $file) { | |
63 | // $yamlUserFiles = $locator->locate($file, NULL, FALSE); | |
64 | // foreach ($yamlUserFiles as $file) { | |
65 | // $delegatingLoader->load($file); | |
66 | // } | |
67 | // } | |
fa184193 | 68 | |
16072ce1 TO |
69 | $container->setDefinition('angular', new Definition( |
70 | '\Civi\Angular\Manager', | |
71 | array() | |
72 | )) | |
73 | ->setFactoryService(self::SELF)->setFactoryMethod('createAngularManager'); | |
74 | ||
fa184193 TO |
75 | $container->setDefinition('dispatcher', new Definition( |
76 | '\Symfony\Component\EventDispatcher\EventDispatcher', | |
77 | array() | |
78 | )) | |
79 | ->setFactoryService(self::SELF)->setFactoryMethod('createEventDispatcher'); | |
80 | ||
c65db512 TO |
81 | $container->setDefinition('magic_function_provider', new Definition( |
82 | '\Civi\API\Provider\MagicFunctionProvider', | |
83 | array() | |
84 | )); | |
85 | ||
0f643fb2 TO |
86 | $container->setDefinition('civi_api_kernel', new Definition( |
87 | '\Civi\API\Kernel', | |
c65db512 | 88 | array(new Reference('dispatcher'), new Reference('magic_function_provider')) |
0f643fb2 TO |
89 | )) |
90 | ->setFactoryService(self::SELF)->setFactoryMethod('createApiKernel'); | |
91 | ||
fa184193 TO |
92 | return $container; |
93 | } | |
94 | ||
16072ce1 TO |
95 | /** |
96 | * @return \Civi\Angular\Manager | |
97 | */ | |
98 | public function createAngularManager() { | |
99 | return new \Civi\Angular\Manager(\CRM_Core_Resources::singleton()); | |
100 | } | |
101 | ||
fa184193 TO |
102 | /** |
103 | * @return \Symfony\Component\EventDispatcher\EventDispatcher | |
104 | */ | |
105 | public function createEventDispatcher() { | |
106 | $dispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher(); | |
708d8fa2 | 107 | $dispatcher->addListener('hook_civicrm_post::Activity', array('\Civi\CCase\Events', 'fireCaseChange')); |
753657ed | 108 | $dispatcher->addListener('hook_civicrm_post::Case', array('\Civi\CCase\Events', 'fireCaseChange')); |
708d8fa2 | 109 | $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\Events', 'delegateToXmlListeners')); |
b019b130 | 110 | $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\SequenceListener', 'onCaseChange_static')); |
8498c2b7 | 111 | $dispatcher->addListener('DAO::post-insert', array('\CRM_Core_BAO_RecurringEntity', 'triggerInsert')); |
112 | $dispatcher->addListener('DAO::post-update', array('\CRM_Core_BAO_RecurringEntity', 'triggerUpdate')); | |
113 | $dispatcher->addListener('DAO::post-delete', array('\CRM_Core_BAO_RecurringEntity', 'triggerDelete')); | |
46bcf597 TO |
114 | $dispatcher->addListener('hook_civicrm_unhandled_exception', array( |
115 | 'CRM_Core_LegacyErrorHandler', | |
7c550ca0 | 116 | 'handleException', |
46bcf597 | 117 | )); |
fa184193 TO |
118 | return $dispatcher; |
119 | } | |
0f643fb2 TO |
120 | |
121 | /** | |
122 | * @param \Symfony\Component\EventDispatcher\EventDispatcher $dispatcher | |
2a6da8d7 EM |
123 | * @param $magicFunctionProvider |
124 | * | |
0f643fb2 TO |
125 | * @return \Civi\API\Kernel |
126 | */ | |
c65db512 | 127 | public function createApiKernel($dispatcher, $magicFunctionProvider) { |
0a946de2 | 128 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\ChainSubscriber()); |
b55bc593 | 129 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\TransactionSubscriber()); |
bace5cd9 | 130 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\I18nSubscriber()); |
c65db512 | 131 | $dispatcher->addSubscriber($magicFunctionProvider); |
d0c9daa4 | 132 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\PermissionCheck()); |
dcef11bd | 133 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\APIv3SchemaAdapter()); |
6d3bdc98 TO |
134 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\WrapperAdapter(array( |
135 | \CRM_Utils_API_HTMLInputCoder::singleton(), | |
136 | \CRM_Utils_API_NullOutputCoder::singleton(), | |
137 | \CRM_Utils_API_ReloadOption::singleton(), | |
138 | \CRM_Utils_API_MatchOption::singleton(), | |
139 | ))); | |
0661f62b | 140 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\XDebugSubscriber()); |
82376c19 TO |
141 | $kernel = new \Civi\API\Kernel($dispatcher); |
142 | ||
143 | $reflectionProvider = new \Civi\API\Provider\ReflectionProvider($kernel); | |
144 | $dispatcher->addSubscriber($reflectionProvider); | |
145 | ||
56154d36 TO |
146 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\DynamicFKAuthorization( |
147 | $kernel, | |
148 | 'Attachment', | |
149 | array('create', 'get', 'delete'), | |
150 | 'SELECT if(cf.id,1,0) as is_valid, cef.entity_table, cef.entity_id | |
151 | FROM civicrm_file cf | |
152 | LEFT JOIN civicrm_entity_file cef ON cf.id = cef.file_id | |
153 | WHERE cf.id = %1', | |
154 | array('civicrm_activity', 'civicrm_mailing') | |
155 | )); | |
156 | ||
82376c19 TO |
157 | $kernel->setApiProviders(array( |
158 | $reflectionProvider, | |
159 | $magicFunctionProvider, | |
160 | )); | |
161 | ||
0f643fb2 TO |
162 | return $kernel; |
163 | } | |
96025800 | 164 | |
fa184193 | 165 | } |