- Parent routes can now be loaded on-demand

This commit is contained in:
Dev 2026-06-09 19:25:05 +00:00
parent eac8269c48
commit 67aa7e513d
3 changed files with 9 additions and 3 deletions

View File

@ -85,14 +85,15 @@ class ObjectReflection {
public function reflectMethods(int $filter = public function reflectMethods(int $filter =
ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED | ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED |
ReflectionMethod::IS_PRIVATE | ReflectionMethod::IS_STATIC | ReflectionMethod::IS_PRIVATE | ReflectionMethod::IS_STATIC |
ReflectionMethod::IS_FINAL ReflectionMethod::IS_FINAL,
bool $includeParents = false
) : array ) : array
{ {
$list = []; $list = [];
foreach($this->classReflection->getMethods($filter) as $method) { foreach($this->classReflection->getMethods($filter) as $method) {
# Skipping parent's methods, we'll retrieve them in its own reflection # Skipping parent's methods, we'll retrieve them in its own reflection
if ( $method->class !== $this->classname ) { if ( ! $includeParents && $method->class !== $this->classname ) {
continue; continue;
} }

View File

@ -8,6 +8,7 @@ class Route implements \Notes\Attribute {
public string|array $method = [ "GET", "POST" ], public string|array $method = [ "GET", "POST" ],
# NULL will fallback on nearest base # NULL will fallback on nearest base
public null|string $base = null, public null|string $base = null,
public null|bool $inheritRoutes = null, # true or false will skip others attribute from parents after, null = skipped for this one.
){} ){}
public function getBase() : ?string public function getBase() : ?string

View File

@ -92,11 +92,13 @@ class RouteFetcher {
$base = null; $base = null;
$class = $this->generateClassname($file->getBasename(".php"), $namespace); $class = $this->generateClassname($file->getBasename(".php"), $namespace);
$methods = null; $methods = null;
$inheritRoutes = null;
$objectResolver = new ObjectResolver($class, $this->cache); $objectResolver = new ObjectResolver($class, $this->cache);
if ( isset($attributes['object']) ) { if ( isset($attributes['object']) ) {
# Also loading Routes attribute from parent classes
$objects = $objectResolver->reflectedClass->getClassAttributeListFromClassname($attributes['object'], true, false); $objects = $objectResolver->reflectedClass->getClassAttributeListFromClassname($attributes['object'], true, false);
foreach($objects as $object) { foreach($objects as $object) {
@ -104,12 +106,13 @@ class RouteFetcher {
$methods ??= (array) $object->method; $methods ??= (array) $object->method;
} }
$inheritRoutes ??= $object->inheritRoutes;
$base ??= $object->base ?? null; $base ??= $object->base ?? null;
} }
} }
if ( isset($attributes['method']) ) { if ( isset($attributes['method']) ) {
$routeList = $objectResolver->reflectedClass->getMethodAttributeListFromClassname( $attributes['method'], false, false ); $routeList = $objectResolver->reflectedClass->getMethodAttributeListFromClassname( $attributes['method'], (bool) $inheritRoutes, false );
foreach($routeList as $func => $routes) { foreach($routeList as $func => $routes) {
if (is_array($routes)) { if (is_array($routes)) {
@ -118,6 +121,7 @@ class RouteFetcher {
if ($route instanceof \Notes\Route\Attribute\Method\Route) { if ($route instanceof \Notes\Route\Attribute\Method\Route) {
$route->base = $route->base ?: $base; $route->base = $route->base ?: $base;
} }
$route->class = $class; $route->class = $class;
$route->classMethod = $func; $route->classMethod = $func;