Merge pull request #2326 from eileenmcnaughton/CRM-14069
[civicrm-core.git] / Civi / Core / Container.php
index 6c22738f2d0ec71696b90f9954b5736078170c23..d1a0578c37923c2fb37a1c6fd9f6b3b75165e308 100644 (file)
@@ -13,6 +13,10 @@ use Symfony\Component\DependencyInjection\Reference;
 
 // TODO use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
 
+/**
+ * Class Container
+ * @package Civi\Core
+ */
 class Container {
 
   const SELF = 'civi_container_factory';
@@ -23,10 +27,11 @@ class Container {
   private static $singleton;
 
   /**
+   * @param bool $reset whether to forcibly rebuild the entire container
    * @return \Symfony\Component\DependencyInjection\TaggedContainerInterface
    */
-  public static function singleton() {
-    if (self::$singleton === NULL) {
+  public static function singleton($reset = FALSE) {
+    if ($reset || self::$singleton === NULL) {
       $c = new self();
       self::$singleton = $c->createContainer();
     }
@@ -35,6 +40,7 @@ class Container {
 
   /**
    * @var ContainerBuilder
+   * @return \Symfony\Component\DependencyInjection\ContainerBuilder
    */
   public function createContainer() {
     $civicrm_base_path = dirname(dirname(__DIR__));
@@ -64,9 +70,14 @@ class Container {
     ))
       ->setFactoryService(self::SELF)->setFactoryMethod('createEventDispatcher');
 
+    $container->setDefinition('magic_function_provider', new Definition(
+      '\Civi\API\Provider\MagicFunctionProvider',
+      array()
+    ));
+
     $container->setDefinition('civi_api_kernel', new Definition(
       '\Civi\API\Kernel',
-      array(new Reference('dispatcher'))
+      array(new Reference('dispatcher'), new Reference('magic_function_provider'))
     ))
       ->setFactoryService(self::SELF)->setFactoryMethod('createApiKernel');
 
@@ -78,25 +89,43 @@ class Container {
    */
   public function createEventDispatcher() {
     $dispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher();
+    $dispatcher->addListener('hook_civicrm_post::Activity', array('\Civi\CCase\Events', 'fireCaseChange'));
+    //$dispatcher->addListener('hook_civicrm_post::Case', array('\Civi\CCase\Events', 'fireCaseChange'));
+    $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\Events', 'delegateToXmlListeners'));
+    $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\SequenceListener', 'onCaseChange_static'));
     return $dispatcher;
   }
 
   /**
    * @param \Symfony\Component\EventDispatcher\EventDispatcher $dispatcher
+   * @param $magicFunctionProvider
+   *
    * @return \Civi\API\Kernel
    */
-  public function createApiKernel($dispatcher) {
+  public function createApiKernel($dispatcher, $magicFunctionProvider) {
+    $dispatcher->addSubscriber(new \Civi\API\Subscriber\ChainSubscriber());
     $dispatcher->addSubscriber(new \Civi\API\Subscriber\TransactionSubscriber());
     $dispatcher->addSubscriber(new \Civi\API\Subscriber\I18nSubscriber());
+    $dispatcher->addSubscriber($magicFunctionProvider);
+    $dispatcher->addSubscriber(new \Civi\API\Subscriber\PermissionCheck());
     $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());
+    $kernel = new \Civi\API\Kernel($dispatcher);
+
+    $reflectionProvider = new \Civi\API\Provider\ReflectionProvider($kernel);
+    $dispatcher->addSubscriber($reflectionProvider);
+
+    $kernel->setApiProviders(array(
+      $reflectionProvider,
+      $magicFunctionProvider,
+    ));
+
     return $kernel;
   }
 }