From a2d22b3c469a0cf88a8e2ee217e3ac37678dfc83 Mon Sep 17 00:00:00 2001 From: Christoph Kappestein Date: Sat, 20 Sep 2025 19:25:58 +0200 Subject: [PATCH] pass ReflectionParameter to attribute resolve method --- src/Illuminate/Container/Attributes/RouteParameter.php | 8 +++++--- src/Illuminate/Container/BoundMethod.php | 2 +- src/Illuminate/Container/Container.php | 7 ++++--- src/Illuminate/Routing/ResolvesRouteDependencies.php | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/Illuminate/Container/Attributes/RouteParameter.php b/src/Illuminate/Container/Attributes/RouteParameter.php index 32afced0ecc4..0194923302d8 100644 --- a/src/Illuminate/Container/Attributes/RouteParameter.php +++ b/src/Illuminate/Container/Attributes/RouteParameter.php @@ -5,6 +5,7 @@ use Attribute; use Illuminate\Contracts\Container\Container; use Illuminate\Contracts\Container\ContextualAttribute; +use ReflectionParameter; #[Attribute(Attribute::TARGET_PARAMETER)] class RouteParameter implements ContextualAttribute @@ -12,7 +13,7 @@ class RouteParameter implements ContextualAttribute /** * Create a new class instance. */ - public function __construct(public string $parameter) + public function __construct(public ?string $parameter = null) { } @@ -21,10 +22,11 @@ public function __construct(public string $parameter) * * @param self $attribute * @param \Illuminate\Contracts\Container\Container $container + * @param \ReflectionParameter $parameter * @return mixed */ - public static function resolve(self $attribute, Container $container) + public static function resolve(self $attribute, Container $container, ReflectionParameter $parameter) { - return $container->make('request')->route($attribute->parameter); + return $container->make('request')->route($attribute->parameter ?? $parameter->getName()); } } diff --git a/src/Illuminate/Container/BoundMethod.php b/src/Illuminate/Container/BoundMethod.php index 9293a818d619..370ee4b24b96 100644 --- a/src/Illuminate/Container/BoundMethod.php +++ b/src/Illuminate/Container/BoundMethod.php @@ -175,7 +175,7 @@ protected static function addDependencyForCallParameter( unset($parameters[$paramName]); } elseif ($attribute = Util::getContextualAttributeFromDependency($parameter)) { - $pendingDependencies[] = $container->resolveFromAttribute($attribute); + $pendingDependencies[] = $container->resolveFromAttribute($attribute, $parameter); } elseif (! is_null($className = Util::getParameterClassName($parameter))) { if (array_key_exists($className, $parameters)) { $pendingDependencies[] = $parameters[$className]; diff --git a/src/Illuminate/Container/Container.php b/src/Illuminate/Container/Container.php index 4a6102a71f5b..f593ae374eaf 100755 --- a/src/Illuminate/Container/Container.php +++ b/src/Illuminate/Container/Container.php @@ -1267,7 +1267,7 @@ protected function resolveDependencies(array $dependencies) $result = null; if (! is_null($attribute = Util::getContextualAttributeFromDependency($dependency))) { - $result = $this->resolveFromAttribute($attribute); + $result = $this->resolveFromAttribute($attribute, $dependency); } // If the class is null, it means the dependency is a string or some other @@ -1416,9 +1416,10 @@ protected function resolveVariadicClass(ReflectionParameter $parameter) * Resolve a dependency based on an attribute. * * @param \ReflectionAttribute $attribute + * @param \ReflectionParameter $parameter * @return mixed */ - public function resolveFromAttribute(ReflectionAttribute $attribute) + public function resolveFromAttribute(ReflectionAttribute $attribute, ReflectionParameter $parameter) { $handler = $this->contextualAttributes[$attribute->getName()] ?? null; @@ -1432,7 +1433,7 @@ public function resolveFromAttribute(ReflectionAttribute $attribute) throw new BindingResolutionException("Contextual binding attribute [{$attribute->getName()}] has no registered handler."); } - return $handler($instance, $this); + return $handler($instance, $this, $parameter); } /** diff --git a/src/Illuminate/Routing/ResolvesRouteDependencies.php b/src/Illuminate/Routing/ResolvesRouteDependencies.php index bd3139fc7691..ee0da613c677 100644 --- a/src/Illuminate/Routing/ResolvesRouteDependencies.php +++ b/src/Illuminate/Routing/ResolvesRouteDependencies.php @@ -76,7 +76,7 @@ public function resolveMethodDependencies(array $parameters, ReflectionFunctionA protected function transformDependency(ReflectionParameter $parameter, $parameters, $skippableValue) { if ($attribute = Util::getContextualAttributeFromDependency($parameter)) { - return $this->container->resolveFromAttribute($attribute); + return $this->container->resolveFromAttribute($attribute, $parameter); } $className = Reflector::getParameterClassName($parameter);