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
;
15 // TODO use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
23 const SELF
= 'civi_container_factory';
26 * @var ContainerBuilder
28 private static $singleton;
32 * Whether to forcibly rebuild the entire container.
33 * @return \Symfony\Component\DependencyInjection\TaggedContainerInterface
35 public static function singleton($reset = FALSE) {
36 if ($reset || self
::$singleton === NULL) {
38 self
::$singleton = $c->createContainer();
40 return self
::$singleton;
44 * @var ContainerBuilder
45 * @return \Symfony\Component\DependencyInjection\ContainerBuilder
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);
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)');
57 // $locator = new FileLocator($configDirectories);
58 // $loaderResolver = new LoaderResolver(array(
59 // new YamlFileLoader($container, $locator)
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);
69 $container->setDefinition('dispatcher', new Definition(
70 '\Symfony\Component\EventDispatcher\EventDispatcher',
73 ->setFactoryService(self
::SELF
)->setFactoryMethod('createEventDispatcher');
75 $container->setDefinition('magic_function_provider', new Definition(
76 '\Civi\API\Provider\MagicFunctionProvider',
80 $container->setDefinition('civi_api_kernel', new Definition(
82 array(new Reference('dispatcher'), new Reference('magic_function_provider'))
84 ->setFactoryService(self
::SELF
)->setFactoryMethod('createApiKernel');
90 * @return \Symfony\Component\EventDispatcher\EventDispatcher
92 public function createEventDispatcher() {
93 $dispatcher = new \Symfony\Component\EventDispatcher\
EventDispatcher();
94 $dispatcher->addListener('hook_civicrm_post::Activity', array('\Civi\CCase\Events', 'fireCaseChange'));
95 $dispatcher->addListener('hook_civicrm_post::Case', array('\Civi\CCase\Events', 'fireCaseChange'));
96 $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\Events', 'delegateToXmlListeners'));
97 $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\SequenceListener', 'onCaseChange_static'));
98 $dispatcher->addListener('DAO::post-insert', array('\CRM_Core_BAO_RecurringEntity', 'triggerInsert'));
99 $dispatcher->addListener('DAO::post-update', array('\CRM_Core_BAO_RecurringEntity', 'triggerUpdate'));
100 $dispatcher->addListener('DAO::post-delete', array('\CRM_Core_BAO_RecurringEntity', 'triggerDelete'));
101 $dispatcher->addListener('hook_civicrm_unhandled_exception', array(
102 'CRM_Core_LegacyErrorHandler',
109 * @param \Symfony\Component\EventDispatcher\EventDispatcher $dispatcher
110 * @param $magicFunctionProvider
112 * @return \Civi\API\Kernel
114 public function createApiKernel($dispatcher, $magicFunctionProvider) {
115 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
ChainSubscriber());
116 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
TransactionSubscriber());
117 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
I18nSubscriber());
118 $dispatcher->addSubscriber($magicFunctionProvider);
119 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
PermissionCheck());
120 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
APIv3SchemaAdapter());
121 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
WrapperAdapter(array(
122 \CRM_Utils_API_HTMLInputCoder
::singleton(),
123 \CRM_Utils_API_NullOutputCoder
::singleton(),
124 \CRM_Utils_API_ReloadOption
::singleton(),
125 \CRM_Utils_API_MatchOption
::singleton(),
127 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
XDebugSubscriber());
128 $kernel = new \Civi\API\
Kernel($dispatcher);
130 $reflectionProvider = new \Civi\API\Provider\
ReflectionProvider($kernel);
131 $dispatcher->addSubscriber($reflectionProvider);
133 $dispatcher->addSubscriber(new \Civi\API\Subscriber\
DynamicFKAuthorization(
136 array('create', 'get', 'delete'),
137 'SELECT if(cf.id,1,0) as is_valid, cef.entity_table, cef.entity_id
139 LEFT JOIN civicrm_entity_file cef ON cf.id = cef.file_id
141 array('civicrm_activity', 'civicrm_mailing')
144 $kernel->setApiProviders(array(
146 $magicFunctionProvider,