diff --git a/src/RouteAttributesServiceProvider.php b/src/RouteAttributesServiceProvider.php index 88868b1..3d785fb 100644 --- a/src/RouteAttributesServiceProvider.php +++ b/src/RouteAttributesServiceProvider.php @@ -32,25 +32,18 @@ protected function registerRoutes(): void $routeRegistrar = $this->app->make(RouteRegistrar::class, [app()->router]) ->useMiddleware(config('route-attributes.middleware') ?? []); - collect($this->getRouteDirectories())->each(function (string|array $directory, string|int $namespace) use ($routeRegistrar) { - if (is_array($directory)) { - $options = Arr::except($directory, ['namespace', 'base_path', 'patterns', 'not_patterns']); + collect($this->getRouteDirectories())->each(function (array $config) use ($routeRegistrar) { + $options = Arr::except($config, ['directory', 'namespace', 'base_path', 'patterns', 'not_patterns', 'use_pathname']); - $routeRegistrar - ->useRootNamespace($directory['namespace'] ?? app()->getNamespace()) - ->useBasePath($directory['base_path'] ?? (isset($directory['namespace']) ? $namespace : app()->path())) - ->group($options, fn () => $routeRegistrar->registerDirectory($namespace, $directory['patterns'] ?? [], $directory['not_patterns'] ?? [])); - } else { - is_string($namespace) - ? $routeRegistrar - ->useRootNamespace($namespace) - ->useBasePath($directory) - ->registerDirectory($directory) - : $routeRegistrar - ->useRootNamespace(app()->getNamespace()) - ->useBasePath(app()->path()) - ->registerDirectory($directory); - } + $routeRegistrar + ->useRootNamespace($config['namespace'] ?? app()->getNamespace()) + ->useBasePath($config['base_path'] ?? (isset($config['namespace']) ? $config['directory'] : app()->path())) + ->group($options, fn () => $routeRegistrar->registerDirectory( + directories: $config['directory'] ?? app()->path(), + patterns: $config['patterns'] ?? [], + notPatterns: $config['not_patterns'] ?? [], + usePathname: $config['use_pathname'] ?? false, + )); }); } diff --git a/src/RouteRegistrar.php b/src/RouteRegistrar.php index f87573b..76c68b1 100644 --- a/src/RouteRegistrar.php +++ b/src/RouteRegistrar.php @@ -69,12 +69,39 @@ public function middleware(): array return $this->middleware ?? []; } - public function registerDirectory(string|array $directories, array $patterns = [], array $notPatterns = []): void + public function registerDirectory(string | array $directories, array $patterns = [], array $notPatterns = [], bool $usePathname = false): void { $directories = Arr::wrap($directories); $patterns = $patterns ?: ['*.php']; - $files = (new Finder)->files()->in($directories)->name($patterns)->notName($notPatterns)->sortByName(); + $files = new Finder()->files()->in($directories); + + if ($usePathname) { + $files = $files->filter(function (\SplFileInfo $file) use ($patterns, $notPatterns) { + if (! $file->isReadable() || $file->getExtension() !== 'php') { + return false; + } + + $pathName = $file->getRelativePathname(); + foreach ($notPatterns as $pattern) { + if (preg_match($pattern, $pathName) === 1) { + return false; + } + } + + foreach ($patterns as $pattern) { + if (preg_match($pattern, $pathName) === 1) { + return true; + } + } + + return false; + }); + } else { + $files = $files->name($patterns)->notName($notPatterns); + } + + $files = $files->sortByName(); $this ->collectGroupsFromFiles($files)