src/Framework/ApiPlatform/Core/Util/ReflectionClassRecursiveIterator.php line 65

Open in your IDE?
  1. <?php
  2. /**
  3.  * Copyright (c) 2011-present Qualiteam software Ltd. All rights reserved.
  4.  * See https://www.x-cart.com/license-agreement.html for license details.
  5.  */
  6. declare(strict_types=1);
  7. namespace XCart\Framework\ApiPlatform\Core\Util;
  8. use XCart\Framework\AutoloaderManager;
  9. /**
  10.  * It is a copy of the class \ApiPlatform\Core\Util\ReflectionClassRecursiveIterator (api-platform/core v2.7.5)
  11.  * This class is injected by aliasing the original class. (@see class_alias())
  12.  * This solution is required to avoid double class declaration in development mode
  13.  *
  14.  * @see \App\Operation\Build\GenerateAutoloader (service-tool)
  15.  * @see /src/vendor/autoload_xcart.php
  16.  */
  17. final class ReflectionClassRecursiveIterator
  18. {
  19.     private function __construct()
  20.     {
  21.     }
  22.     public static function getReflectionClassesFromDirectories(array $directories): \Iterator
  23.     {
  24.         foreach ($directories as $path) {
  25.             $iterator = new \RegexIterator(
  26.                 new \RecursiveIteratorIterator(
  27.                     new \RecursiveDirectoryIterator($path\FilesystemIterator::SKIP_DOTS),
  28.                     \RecursiveIteratorIterator::LEAVES_ONLY
  29.                 ),
  30.                 '/^.+\.php$/i',
  31.                 \RecursiveRegexIterator::GET_MATCH
  32.             );
  33.             foreach ($iterator as $file) {
  34.                 $sourceFile $file[0];
  35.                 if (!preg_match('(^phar:)i'$sourceFile)) {
  36.                     $sourceFile realpath($sourceFile);
  37.                 }
  38.                 try {
  39.                     /* Original code:
  40.                     require_once $sourceFile;
  41.                     */
  42.                     /* Modified code: */
  43.                     // In XC development autoloader class may be included by fake path so *_once is not a solution
  44.                     // Check for the class existence manually it triggers autoloader
  45.                     if (
  46.                         preg_match('#var/run/classes/(.*)\.php#'$sourceFile$matches)
  47.                         && ($name str_replace('/''\\'$matches[1]))
  48.                         && (class_exists($name) || interface_exists($name) || trait_exists($name))
  49.                     ) {
  50.                         $sourceFile AutoloaderManager::getCurrentAutoloader()->getSourceFilePath($name);
  51.                     } else {
  52.                         require_once $sourceFile;
  53.                     }
  54.                     /* End of modified code */
  55.                 } catch (\Throwable $t) {
  56.                     // invalid PHP file (example: missing parent class)
  57.                     continue;
  58.                 }
  59.                 $includedFiles[$sourceFile] = true;
  60.             }
  61.         }
  62.         $sortedClasses get_declared_classes();
  63.         sort($sortedClasses);
  64.         $sortedInterfaces get_declared_interfaces();
  65.         sort($sortedInterfaces);
  66.         $declared array_merge($sortedClasses$sortedInterfaces);
  67.         foreach ($declared as $className) {
  68.             $reflectionClass = new \ReflectionClass($className);
  69.             $sourceFile $reflectionClass->getFileName();
  70.             if (isset($includedFiles[$sourceFile])) {
  71.                 yield $className => $reflectionClass;
  72.             }
  73.         }
  74.     }
  75. }