Get fully-qualified classnames based on directory and file paths.
Install via Composer:
composer require jerowork/file-class-reflector
The ClassReflector
makes use of the nikic/php-parser
package to retrieve the fully-qualified class name from a file.
Basic usage:
use Jerowork\FileClassReflector\NikicParser\NikicParserClassReflectorFactory;
// Create a new ClassReflector instance directly via a static factory method
$reflector = NikicParserClassReflectorFactory::createInstance();
// Add necessary directories and/or files and reflect
$reflector
->addDirectory(__DIR__ . '/some/directory')
->reflect();
// Get all \ReflectionClass found in files
$classes = $reflector->getClasses();
The ClassReflectorFactory
can also be instantiated via the constructor.
In this way the factory can be added to a DI container.
use Jerowork\FileClassReflector\FileFinder\RegexIterator\RegexIteratorFileFinder;
use Jerowork\FileClassReflector\NikicParser\NikicParserClassReflectorFactory;
use PhpParser\NodeTraverser;
use PhpParser\ParserFactory;
// Create the factory
$factory = new NikicParserClassReflectorFactory(
new RegexIteratorFileFinder(),
(new ParserFactory())->create(ParserFactory::PREFER_PHP7),
new NodeTraverser(),
);
// Create a new ClassReflector instance
$reflector = $factory->create();
// ...
As a good practice we should always 'program to interfaces, not implementations', you should add this to your DI container.
PSR-11 Container example:
use Jerowork\FileClassReflector\ClassReflectorFactory;
use Jerowork\FileClassReflector\FileFinder\FileFinder;
use Jerowork\FileClassReflector\FileFinder\RegexIterator\RegexIteratorFileFinder;
use Jerowork\FileClassReflector\NikicParser\NikicParserClassReflectorFactory;
use PhpParser\NodeTraverser;
use PhpParser\ParserFactory;
use Psr\Container\ContainerInterface;
return [
ClassReflectorFactory::class => static function (ContainerInterface $container): ClassReflectorFactory {
return new NikicParserClassReflectorFactory(
new RegexIteratorFileFinder(),
(new ParserFactory())->create(ParserFactory::PREFER_PHP7),
new NodeTraverser(),
);
},
FileFinder::class => static fn (): FileFinder => new RegexIteratorFileFinder(),
];
Symfony YAML-file example:
services:
_defaults:
autowire: true
autoconfigure: true
Jerowork\FileClassReflector\ClassReflectorFactory:
class: Jerowork\FileClassReflector\NikicParser\NikicParserClassReflectorFactory
Jerowork\FileClassReflector\FileFinder\FileFinder:
class: Jerowork\FileClassReflector\FileFinder\RegexIterator\RegexIteratorFileFinder
PhpParser\ParserFactory: ~
PhpParser\Parser:
factory: ['@PhpParser\ParserFactory', 'create']
arguments: [1] # 1 = ParserFactory::PREFER_PHP7
PhpParser\NodeTraverser: ~