Commit | Line | Data |
---|---|---|
fa184193 TO |
1 | <?php |
2 | namespace Civi\Core; | |
3 | use Doctrine\Common\Annotations\AnnotationReader; | |
4 | use Doctrine\Common\Annotations\AnnotationRegistry; | |
5 | use Doctrine\Common\Annotations\FileCacheReader; | |
6 | use Doctrine\Common\Cache\FilesystemCache; | |
7 | use Doctrine\ORM\EntityManager; | |
8 | use Doctrine\ORM\Mapping\Driver\AnnotationDriver; | |
9 | use Doctrine\ORM\Tools\Setup; | |
10 | use Symfony\Component\DependencyInjection\ContainerBuilder; | |
11 | use Symfony\Component\DependencyInjection\Definition; | |
12 | use Symfony\Component\DependencyInjection\Reference; | |
13 | ||
14 | // TODO use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; | |
15 | ||
6550386a EM |
16 | /** |
17 | * Class Container | |
18 | * @package Civi\Core | |
19 | */ | |
fa184193 TO |
20 | class Container { |
21 | ||
22 | const SELF = 'civi_container_factory'; | |
23 | ||
24 | /** | |
25 | * @var ContainerBuilder | |
26 | */ | |
27 | private static $singleton; | |
28 | ||
29 | /** | |
378e2654 | 30 | * @param bool $reset whether to forcibly rebuild the entire container |
fa184193 TO |
31 | * @return \Symfony\Component\DependencyInjection\TaggedContainerInterface |
32 | */ | |
378e2654 TO |
33 | public static function singleton($reset = FALSE) { |
34 | if ($reset || self::$singleton === NULL) { | |
fa184193 TO |
35 | $c = new self(); |
36 | self::$singleton = $c->createContainer(); | |
37 | } | |
38 | return self::$singleton; | |
39 | } | |
40 | ||
41 | /** | |
42 | * @var ContainerBuilder | |
77b97be7 | 43 | * @return \Symfony\Component\DependencyInjection\ContainerBuilder |
fa184193 TO |
44 | */ |
45 | public function createContainer() { | |
46 | $civicrm_base_path = dirname(dirname(__DIR__)); | |
47 | $container = new ContainerBuilder(); | |
48 | $container->setParameter('civicrm_base_path', $civicrm_base_path); | |
49 | $container->set(self::SELF, $this); | |
50 | ||
51 | // TODO Move configuration to an external file; define caching structure | |
52 | // if (empty($configDirectories)) { | |
53 | // throw new \Exception(__CLASS__ . ': Missing required properties (civicrmRoot, configDirectories)'); | |
54 | // } | |
55 | // $locator = new FileLocator($configDirectories); | |
56 | // $loaderResolver = new LoaderResolver(array( | |
57 | // new YamlFileLoader($container, $locator) | |
58 | // )); | |
59 | // $delegatingLoader = new DelegatingLoader($loaderResolver); | |
60 | // foreach (array('services.yml') as $file) { | |
61 | // $yamlUserFiles = $locator->locate($file, NULL, FALSE); | |
62 | // foreach ($yamlUserFiles as $file) { | |
63 | // $delegatingLoader->load($file); | |
64 | // } | |
65 | // } | |
66 | ||
67 | $container->setDefinition('dispatcher', new Definition( | |
68 | '\Symfony\Component\EventDispatcher\EventDispatcher', | |
69 | array() | |
70 | )) | |
71 | ->setFactoryService(self::SELF)->setFactoryMethod('createEventDispatcher'); | |
72 | ||
c65db512 TO |
73 | $container->setDefinition('magic_function_provider', new Definition( |
74 | '\Civi\API\Provider\MagicFunctionProvider', | |
75 | array() | |
76 | )); | |
77 | ||
0f643fb2 TO |
78 | $container->setDefinition('civi_api_kernel', new Definition( |
79 | '\Civi\API\Kernel', | |
c65db512 | 80 | array(new Reference('dispatcher'), new Reference('magic_function_provider')) |
0f643fb2 TO |
81 | )) |
82 | ->setFactoryService(self::SELF)->setFactoryMethod('createApiKernel'); | |
83 | ||
fa184193 TO |
84 | return $container; |
85 | } | |
86 | ||
87 | /** | |
88 | * @return \Symfony\Component\EventDispatcher\EventDispatcher | |
89 | */ | |
90 | public function createEventDispatcher() { | |
91 | $dispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher(); | |
708d8fa2 | 92 | $dispatcher->addListener('hook_civicrm_post::Activity', array('\Civi\CCase\Events', 'fireCaseChange')); |
753657ed | 93 | $dispatcher->addListener('hook_civicrm_post::Case', array('\Civi\CCase\Events', 'fireCaseChange')); |
708d8fa2 | 94 | $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\Events', 'delegateToXmlListeners')); |
b019b130 | 95 | $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\SequenceListener', 'onCaseChange_static')); |
fa184193 TO |
96 | return $dispatcher; |
97 | } | |
0f643fb2 TO |
98 | |
99 | /** | |
100 | * @param \Symfony\Component\EventDispatcher\EventDispatcher $dispatcher | |
2a6da8d7 EM |
101 | * @param $magicFunctionProvider |
102 | * | |
0f643fb2 TO |
103 | * @return \Civi\API\Kernel |
104 | */ | |
c65db512 | 105 | public function createApiKernel($dispatcher, $magicFunctionProvider) { |
0a946de2 | 106 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\ChainSubscriber()); |
b55bc593 | 107 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\TransactionSubscriber()); |
bace5cd9 | 108 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\I18nSubscriber()); |
c65db512 | 109 | $dispatcher->addSubscriber($magicFunctionProvider); |
d0c9daa4 | 110 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\PermissionCheck()); |
dcef11bd | 111 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\APIv3SchemaAdapter()); |
6d3bdc98 TO |
112 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\WrapperAdapter(array( |
113 | \CRM_Utils_API_HTMLInputCoder::singleton(), | |
114 | \CRM_Utils_API_NullOutputCoder::singleton(), | |
115 | \CRM_Utils_API_ReloadOption::singleton(), | |
116 | \CRM_Utils_API_MatchOption::singleton(), | |
117 | ))); | |
0661f62b | 118 | $dispatcher->addSubscriber(new \Civi\API\Subscriber\XDebugSubscriber()); |
82376c19 TO |
119 | $kernel = new \Civi\API\Kernel($dispatcher); |
120 | ||
121 | $reflectionProvider = new \Civi\API\Provider\ReflectionProvider($kernel); | |
122 | $dispatcher->addSubscriber($reflectionProvider); | |
123 | ||
124 | $kernel->setApiProviders(array( | |
125 | $reflectionProvider, | |
126 | $magicFunctionProvider, | |
127 | )); | |
128 | ||
0f643fb2 TO |
129 | return $kernel; |
130 | } | |
fa184193 | 131 | } |