CRM-14727 - Implement Civi\CCase\SequenceListener
[civicrm-core.git] / Civi / Core / Container.php
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
16 /**
17 * Class Container
18 * @package Civi\Core
19 */
20 class Container {
21
22 const SELF = 'civi_container_factory';
23
24 /**
25 * @var ContainerBuilder
26 */
27 private static $singleton;
28
29 /**
30 * @param bool $reset whether to forcibly rebuild the entire container
31 * @return \Symfony\Component\DependencyInjection\TaggedContainerInterface
32 */
33 public static function singleton($reset = FALSE) {
34 if ($reset || self::$singleton === NULL) {
35 $c = new self();
36 self::$singleton = $c->createContainer();
37 }
38 return self::$singleton;
39 }
40
41 /**
42 * @var ContainerBuilder
43 * @return \Symfony\Component\DependencyInjection\ContainerBuilder
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
73 $container->setDefinition('magic_function_provider', new Definition(
74 '\Civi\API\Provider\MagicFunctionProvider',
75 array()
76 ));
77
78 $container->setDefinition('civi_api_kernel', new Definition(
79 '\Civi\API\Kernel',
80 array(new Reference('dispatcher'), new Reference('magic_function_provider'))
81 ))
82 ->setFactoryService(self::SELF)->setFactoryMethod('createApiKernel');
83
84 return $container;
85 }
86
87 /**
88 * @return \Symfony\Component\EventDispatcher\EventDispatcher
89 */
90 public function createEventDispatcher() {
91 $dispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher();
92 $dispatcher->addListener('hook_civicrm_post::Activity', array('\Civi\CCase\Events', 'fireCaseChange'));
93 $dispatcher->addListener('hook_civicrm_post::Case', array('\Civi\CCase\Events', 'fireCaseChange'));
94 $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\Events', 'delegateToXmlListeners'));
95 $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\SequenceListener', 'onCaseChange_static'));
96 return $dispatcher;
97 }
98
99 /**
100 * @param \Symfony\Component\EventDispatcher\EventDispatcher $dispatcher
101 * @param $magicFunctionProvider
102 *
103 * @return \Civi\API\Kernel
104 */
105 public function createApiKernel($dispatcher, $magicFunctionProvider) {
106 $dispatcher->addSubscriber(new \Civi\API\Subscriber\ChainSubscriber());
107 $dispatcher->addSubscriber(new \Civi\API\Subscriber\TransactionSubscriber());
108 $dispatcher->addSubscriber(new \Civi\API\Subscriber\I18nSubscriber());
109 $dispatcher->addSubscriber($magicFunctionProvider);
110 $dispatcher->addSubscriber(new \Civi\API\Subscriber\PermissionCheck());
111 $dispatcher->addSubscriber(new \Civi\API\Subscriber\APIv3SchemaAdapter());
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 )));
118 $dispatcher->addSubscriber(new \Civi\API\Subscriber\XDebugSubscriber());
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
129 return $kernel;
130 }
131 }