Merge remote-tracking branch 'upstream/4.4' into 4.4-master-2014-08-25-10-57-01
[civicrm-core.git] / Civi / Core / Container.php
CommitLineData
fa184193
TO
1<?php
2namespace Civi\Core;
3use Doctrine\Common\Annotations\AnnotationReader;
4use Doctrine\Common\Annotations\AnnotationRegistry;
5use Doctrine\Common\Annotations\FileCacheReader;
6use Doctrine\Common\Cache\FilesystemCache;
7use Doctrine\ORM\EntityManager;
8use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
9use Doctrine\ORM\Tools\Setup;
10use Symfony\Component\DependencyInjection\ContainerBuilder;
11use Symfony\Component\DependencyInjection\Definition;
12use 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
20class 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}