From 585c427cae8b711c79499f16de6450733dd19fd8 Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Thu, 20 Feb 2025 10:29:28 -0500 Subject: [PATCH 1/2] Add test coverage for broken primitive type hints. --- tests/Routing/RoutesTest.php | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/Routing/RoutesTest.php b/tests/Routing/RoutesTest.php index e5c5fc8fae..932c3a4d39 100644 --- a/tests/Routing/RoutesTest.php +++ b/tests/Routing/RoutesTest.php @@ -74,6 +74,10 @@ protected function resolveApplicationConfiguration($app) return view('test', ['hello' => "view closure dependencies: $request->value $foo->value $bar->value $baz $qux"]); }); + Route::statamic('/route/with/placeholders/view/closure-primitive-type-hints/{name}/{age}', function (string $name, int $age) { + return view('test', ['hello' => "view closure placeholders: $name $age"]); + }); + Route::statamic('/route/with/placeholders/data/closure/{foo}/{bar}/{baz}', 'test', function ($foo, $bar, $baz) { return ['hello' => "data closure placeholders: $foo $bar $baz"]; }); @@ -86,6 +90,10 @@ protected function resolveApplicationConfiguration($app) return ['hello' => "data closure dependencies: $request->value $foo->value $bar->value $baz $qux"]; }); + Route::statamic('/route/with/placeholders/data/closure-primitive-type-hints/{name}/{age}', 'test', function (string $name, int $age) { + return ['hello' => "data closure placeholders: $name $age"]; + }); + Route::statamic('/route-with-custom-layout', 'test', [ 'layout' => 'custom-layout', 'hello' => 'world', @@ -320,6 +328,17 @@ public function it_renders_a_view_with_placeholders_using_a_view_closure_and_dep ->assertSee('Hello view closure dependencies: request_value foo_class bar_class_modified one two'); } + #[Test] + public function it_renders_a_view_with_placeholders_using_a_view_closure_using_primitive_type_hints() + { + $this->viewShouldReturnRaw('layout', '{{ template_content }}'); + $this->viewShouldReturnRaw('test', 'Hello {{ hello }}'); + + $this->get('/route/with/placeholders/view/closure-primitive-type-hints/darth/42') + ->assertOk() + ->assertSee('Hello view closure placeholders: darth 42'); + } + #[Test] public function it_renders_a_view_with_placeholders_using_a_data_closure() { @@ -360,6 +379,17 @@ public function it_renders_a_view_with_placeholders_using_a_data_closure_and_dep ->assertSee('Hello data closure dependencies: request_value foo_class bar_class_modified one two'); } + #[Test] + public function it_renders_a_view_with_placeholders_using_a_data_closure_using_primitive_type_hints() + { + $this->viewShouldReturnRaw('layout', '{{ template_content }}'); + $this->viewShouldReturnRaw('test', 'Hello {{ hello }}'); + + $this->get('/route/with/placeholders/data/closure-primitive-type-hints/darth/42') + ->assertOk() + ->assertSee('Hello data closure placeholders: darth 42'); + } + #[Test] public function it_renders_a_view_with_custom_layout() { From 3a1686143a21adc8144482ff7f71b663286a56ad Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Thu, 20 Feb 2025 10:36:02 -0500 Subject: [PATCH 2/2] Check if type exists as class before attempting to instantiate. --- src/Http/Controllers/FrontendController.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Http/Controllers/FrontendController.php b/src/Http/Controllers/FrontendController.php index 3da91b639a..f7204225cc 100644 --- a/src/Http/Controllers/FrontendController.php +++ b/src/Http/Controllers/FrontendController.php @@ -99,7 +99,10 @@ private static function resolveRouteClosure(Closure $closure, array $params) $reflect = new ReflectionFunction($closure); $params = collect($reflect->getParameters()) - ->map(fn ($param) => $param->hasType() ? app($param->getType()->getName()) : $params[$param->getName()]) + ->map(fn ($param) => $param->hasType() && class_exists($class = $param->getType()->getName()) + ? app($class) + : $params[$param->getName()] + ) ->all(); return $closure(...$params);