createContainer(); } return self::$singleton; } /** * @var ContainerBuilder */ public function createContainer() { $civicrm_base_path = dirname(dirname(__DIR__)); $container = new ContainerBuilder(); $container->setParameter('civicrm_base_path', $civicrm_base_path); $container->set(self::SELF, $this); // TODO Move configuration to an external file; define caching structure // if (empty($configDirectories)) { // throw new \Exception(__CLASS__ . ': Missing required properties (civicrmRoot, configDirectories)'); // } // $locator = new FileLocator($configDirectories); // $loaderResolver = new LoaderResolver(array( // new YamlFileLoader($container, $locator) // )); // $delegatingLoader = new DelegatingLoader($loaderResolver); // foreach (array('services.yml') as $file) { // $yamlUserFiles = $locator->locate($file, NULL, FALSE); // foreach ($yamlUserFiles as $file) { // $delegatingLoader->load($file); // } // } $container->setDefinition('dispatcher', new Definition( '\Symfony\Component\EventDispatcher\EventDispatcher', array() )) ->setFactoryService(self::SELF)->setFactoryMethod('createEventDispatcher'); $container->setDefinition('civi_api_kernel', new Definition( '\Civi\API\Kernel', array(new Reference('dispatcher')) )) ->setFactoryService(self::SELF)->setFactoryMethod('createApiKernel'); return $container; } /** * @return \Symfony\Component\EventDispatcher\EventDispatcher */ public function createEventDispatcher() { $dispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher(); return $dispatcher; } /** * @param \Symfony\Component\EventDispatcher\EventDispatcher $dispatcher * @return \Civi\API\Kernel */ public function createApiKernel($dispatcher) { $dispatcher->addSubscriber(new \Civi\API\Subscriber\TransactionSubscriber()); $dispatcher->addSubscriber(new \Civi\API\Subscriber\I18nSubscriber()); $dispatcher->addSubscriber(new \Civi\API\Subscriber\APIv3SchemaAdapter()); $dispatcher->addSubscriber(new \Civi\API\Subscriber\WrapperAdapter(array( \CRM_Utils_API_HTMLInputCoder::singleton(), \CRM_Utils_API_NullOutputCoder::singleton(), \CRM_Utils_API_ReloadOption::singleton(), \CRM_Utils_API_MatchOption::singleton(), ))); $dispatcher->addSubscriber(new \Civi\API\Subscriber\XDebugSubscriber()); $dispatcher->addListener(\Civi\API\Events::AUTHORIZE, function(\Civi\API\Event\AuthorizeEvent $event) { $apiRequest = $event->getApiRequest(); // At time of writing, _civicrm_api3_api_check_permission generates an exception on failure _civicrm_api3_api_check_permission($apiRequest['entity'], $apiRequest['action'], $apiRequest['params']); $event->authorize(); }); $kernel = new \Civi\API\Kernel($dispatcher, array()); return $kernel; } }