APIv4 - Move filtering of component entities higher up
authorColeman Watts <coleman@civicrm.org>
Wed, 27 Apr 2022 16:55:47 +0000 (18:55 +0200)
committerColeman Watts <coleman@civicrm.org>
Wed, 27 Apr 2022 18:58:18 +0000 (20:58 +0200)
Filtering out component entities at a low level was causing errors when trying
to get basic info about an entity from a disabled component.
It's better to do the filtering in the Entity.get action instead.

Civi/Api4/Action/Entity/Get.php
Civi/Api4/Provider/ActionObjectProvider.php

index 9a8ccbb5f979f0845508a9d1ab3f9fe7dea741b3..13b96573fe637a93010f6ec1a7aa801ea2431c15 100644 (file)
@@ -28,11 +28,15 @@ class Get extends \Civi\Api4\Generic\BasicGetAction {
   protected $includeCustom;
 
   /**
-   * Returns all APIv4 entities
+   * Returns all APIv4 entities from core, enabled components and enabled extensions.
    */
   protected function getRecords() {
     $provider = \Civi::service('action_object_provider');
-    return $provider->getEntities();
+    return array_filter($provider->getEntities(), function($entity) {
+      // Only include DAO entities from enabled components
+      $daoName = $entity['dao'] ?? NULL;
+      return (!$daoName || !defined("{$daoName}::COMPONENT") || \CRM_Core_Component::isEnabled($daoName::COMPONENT));
+    });
   }
 
 }
index 2c284e3cc04f2930faf337fbdde9369a007b71ed..4d6dda02df31f410df5dbf726fb7bf4c31d8ea10 100644 (file)
@@ -152,7 +152,8 @@ class ActionObjectProvider implements EventSubscriberInterface, ProviderInterfac
     if (!$entities) {
       // Load entities declared in API files
       foreach ($this->getAllApiClasses() as $className) {
-        $this->loadEntity($className, $entities);
+        $info = $className::getInfo();
+        $entities[$info['name']] = $info;
       }
       // Allow extensions to modify the list of entities
       $event = GenericHookEvent::create(['entities' => &$entities]);
@@ -164,19 +165,6 @@ class ActionObjectProvider implements EventSubscriberInterface, ProviderInterfac
     return $entities;
   }
 
-  /**
-   * @param \Civi\Api4\Generic\AbstractEntity $className
-   * @param array $entities
-   */
-  private function loadEntity($className, array &$entities) {
-    $info = $className::getInfo();
-    $daoName = $info['dao'] ?? NULL;
-    // Only include DAO entities from enabled components
-    if (!$daoName || !defined("{$daoName}::COMPONENT") || \CRM_Core_Component::isEnabled($daoName::COMPONENT)) {
-      $entities[$info['name']] = $info;
-    }
-  }
-
   /**
    * Scan all api directories to discover entities
    * @return \Civi\Api4\Generic\AbstractEntity[]