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
;
14 // TODO use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
22 const SELF
= 'civi_container_factory';
25 * @var ContainerBuilder
27 private static $singleton;
30 * @param bool $reset whether to forcibly rebuild the entire container
31 * @return \Symfony\Component\DependencyInjection\TaggedContainerInterface
33 public static function singleton($reset = FALSE) {
34 if ($reset || self
::$singleton === NULL) {
36 self
::$singleton = $c->createContainer();
38 return self
::$singleton;
42 * @var ContainerBuilder
43 * @return \Symfony\Component\DependencyInjection\ContainerBuilder
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);
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)');
55 // $locator = new FileLocator($configDirectories);
56 // $loaderResolver = new LoaderResolver(array(
57 // new YamlFileLoader($container, $locator)
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);
67 $container->setDefinition('dispatcher', new Definition(
68 '\Symfony\Component\EventDispatcher\EventDispatcher',
71 ->setFactoryService(self
::SELF
)->setFactoryMethod('createEventDispatcher');
73 $container->setDefinition('magic_function_provider', new Definition(
74 '\Civi\API\Provider\MagicFunctionProvider',
78 $container->setDefinition('civi_api_kernel', new Definition(
80 array(new Reference('dispatcher'), new Reference('magic_function_provider'))
82 ->setFactoryService(self
::SELF
)->setFactoryMethod('createApiKernel');
88 * @return \Symfony\Component\EventDispatcher\EventDispatcher
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'));
99 * @param \Symfony\Component\EventDispatcher\EventDispatcher $dispatcher
100 * @param $magicFunctionProvider
102 * @return \Civi\API\Kernel
104 public function createApiKernel($dispatcher, $magicFunctionProvider) {
105 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
ChainSubscriber());
106 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
TransactionSubscriber());
107 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
I18nSubscriber());
108 $dispatcher->addSubscriber($magicFunctionProvider);
109 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
PermissionCheck());
110 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
APIv3SchemaAdapter());
111 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
WrapperAdapter(array(
112 \CRM_Utils_API_HTMLInputCoder
::singleton(),
113 \CRM_Utils_API_NullOutputCoder
::singleton(),
114 \CRM_Utils_API_ReloadOption
::singleton(),
115 \CRM_Utils_API_MatchOption
::singleton(),
117 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
XDebugSubscriber());
118 $kernel = new \Civi\API\
Kernel($dispatcher);
120 $reflectionProvider = new \Civi\API\Provider\
ReflectionProvider($kernel);
121 $dispatcher->addSubscriber($reflectionProvider);
123 $kernel->setApiProviders(array(
125 $magicFunctionProvider,