WorkflowMessage - Switch to `ClassScanner` (was: bespoke `include_path` search)
authorTim Otten <totten@civicrm.org>
Tue, 21 Jun 2022 09:12:23 +0000 (02:12 -0700)
committerTim Otten <totten@civicrm.org>
Tue, 28 Jun 2022 00:18:21 +0000 (17:18 -0700)
Civi/WorkflowMessage/WorkflowMessage.php

index 7ecf283bdbe50a8bbaa6b5ab827a9ff17263cfb4..8d9296b67e3a2cdaa484069dacbfbe4647e63eae 100644 (file)
@@ -13,6 +13,7 @@
 namespace Civi\WorkflowMessage;
 
 use Civi\Api4\Utils\ReflectionUtils;
+use Civi\Core\ClassScanner;
 use Civi\WorkflowMessage\Exception\WorkflowMessageException;
 
 /**
@@ -146,18 +147,9 @@ class WorkflowMessage {
     $map = $cache->get($cacheKey);
     if ($map === NULL) {
       $map = [];
-      $map['generic'] = GenericWorkflowMessage::class;
-      $baseDirs = explode(PATH_SEPARATOR, get_include_path());
-      foreach ($baseDirs as $baseDir) {
-        $baseDir = \CRM_Utils_File::addTrailingSlash($baseDir);
-        $glob = (array) glob($baseDir . 'CRM/*/WorkflowMessage/*.php');
-        $glob = preg_grep('/\.ex\.php$/', $glob, PREG_GREP_INVERT);
-        foreach ($glob as $file) {
-          $class = strtr(preg_replace('/\.php$/', '', \CRM_Utils_File::relativize($file, $baseDir)), ['/' => '_', '\\' => '_']);
-          if (class_exists($class) && (new \ReflectionClass($class))->implementsInterface(WorkflowMessageInterface::class)) {
-            $map[$class::WORKFLOW] = $class;
-          }
-        }
+      foreach (ClassScanner::get(['interface' => WorkflowMessageInterface::class]) as $wfClass) {
+        $wfName = ($wfClass === GenericWorkflowMessage::class) ? 'generic' : $wfClass::WORKFLOW;
+        $map[$wfName] = $wfClass;
       }
       $cache->set($cacheKey, $map);
     }