Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- namespace App\Services\Utils;
- use App\Contracts\Utils\FindClassesInNamespaceContract;
- use Illuminate\Support\Str;
- use Symfony\Component\Finder\Finder;
- class FindClassesInNamespace implements FindClassesInNamespaceContract
- {
- /**
- * @var Finder
- */
- protected $finder;
- /**
- * @var array
- */
- protected $namespacePathMap;
- /**
- * FindClassesInNamespace constructor.
- * @param Finder $finder
- */
- public function __construct(Finder $finder)
- {
- $this->finder = $finder;
- $this->namespacePathMap = [
- 'App' => base_path('app'),
- 'Gazelkin' => base_path('src')
- ];
- }
- /**
- * @param string $namespace
- * @return \Traversable&string[]
- */
- public function find(string $namespace): \Traversable
- {
- $pathPrefix = $this->getPathPrefix($namespace);
- $path = $this->makePathFromNamespace($pathPrefix, $namespace);
- foreach ($this->findFiles($path) as $file) {
- yield Str::after(
- str_replace(['/', '.php'], ['\\', ''], $file->getPathname()),
- $pathPrefix . DIRECTORY_SEPARATOR
- );
- }
- }
- /**
- * @param string $namespace
- * @return string
- */
- private function getPathPrefix(string $namespace): string
- {
- foreach ($this->namespacePathMap as $prefix => $path) {
- if (Str::startsWith($namespace, $prefix)) {
- return $path;
- }
- }
- throw new \InvalidArgumentException('Unknown namespace');
- }
- /**
- * @param string $pathPrefix
- * @param string $namespace
- * @return string
- */
- private function makePathFromNamespace(string $pathPrefix, string $namespace): string
- {
- $path = str_replace('\\', '/', $namespace);
- return $pathPrefix . '/' . $path;
- }
- /**
- * @param $path
- * @return \Traversable&\SplFileInfo[]
- */
- private function findFiles($path): \Traversable
- {
- return $this->finder->files()->in($path)->name('*.php');
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement