. */ namespace Irstea\PlantUmlBundle\Finder; use ArrayIterator; use Irstea\PlantUmlBundle\Model\Filter\DirectoryFilter; use ReflectionClass; use Symfony\Component\Config\Definition\Exception\Exception; use Symfony\Component\Finder\Finder; use Symfony\Component\Finder\SplFileInfo; /** * Description of ClassFinder. */ class ClassFinder implements FinderInterface { /** * @var string[] */ private $directories; /** * @var \ReflectionClass */ private $classes = null; /** * ClassFinder constructor. * * @param string[] $directories */ public function __construct(array $directories) { $this->directories = $directories; } private function initialize(): void { $files = Finder::create() ->in($this->directories) ->files() ->name('*.php') ->getIterator(); foreach ($files as $file) { /* @var $file SplFileInfo */ $path = $file->getPathname(); try { irstea_plantmul_include($path); } catch (Exception $ex) { printf("%s: %s (%s)\n", $path, get_class($ex), $ex->getMessage()); } } $filter = new DirectoryFilter($this->directories); $this->classes = []; foreach (get_declared_classes() as $className) { $class = new ReflectionClass($className); if ($filter->accept($class)) { $this->classes[$className] = $class; } } } /** * @return ArrayIterator|\Traversable */ public function getIterator() { if ($this->classes === null) { $this->initialize(); } return new ArrayIterator($this->classes); } /** * @param array $conf */ public function toConfig(array &$conf) { $conf['type'] = 'classes'; $conf['directories'] = $this->directories; } }