From 21c1a310907e6f7bb277216c7dd29fb398127a8f Mon Sep 17 00:00:00 2001 From: Jamie York Date: Fri, 4 Jul 2025 22:29:57 +0100 Subject: [PATCH 1/7] get and post contextual attributes --- src/Illuminate/Container/Attributes/Get.php | 26 ++++++++++++++++++++ src/Illuminate/Container/Attributes/Post.php | 26 ++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/Illuminate/Container/Attributes/Get.php create mode 100644 src/Illuminate/Container/Attributes/Post.php diff --git a/src/Illuminate/Container/Attributes/Get.php b/src/Illuminate/Container/Attributes/Get.php new file mode 100644 index 000000000000..d2f6e5221044 --- /dev/null +++ b/src/Illuminate/Container/Attributes/Get.php @@ -0,0 +1,26 @@ +make('request')->get($attribute->key, $attribute->default); + } +} diff --git a/src/Illuminate/Container/Attributes/Post.php b/src/Illuminate/Container/Attributes/Post.php new file mode 100644 index 000000000000..7c600b3fbfa8 --- /dev/null +++ b/src/Illuminate/Container/Attributes/Post.php @@ -0,0 +1,26 @@ +make('request')->post($attribute->key, $attribute->default); + } +} From 468fb3440df8a0b119085ff48a0f43de4d22eb6b Mon Sep 17 00:00:00 2001 From: Jamie York Date: Fri, 4 Jul 2025 23:02:20 +0100 Subject: [PATCH 2/7] test contextual attributes --- .../ContextualAttributeBindingTest.php | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/tests/Container/ContextualAttributeBindingTest.php b/tests/Container/ContextualAttributeBindingTest.php index 9d87cdd22a24..2b4579d7ff04 100644 --- a/tests/Container/ContextualAttributeBindingTest.php +++ b/tests/Container/ContextualAttributeBindingTest.php @@ -14,8 +14,10 @@ use Illuminate\Container\Attributes\Context; use Illuminate\Container\Attributes\CurrentUser; use Illuminate\Container\Attributes\Database; +use Illuminate\Container\Attributes\Get; use Illuminate\Container\Attributes\Give; use Illuminate\Container\Attributes\Log; +use Illuminate\Container\Attributes\Post; use Illuminate\Container\Attributes\RouteParameter; use Illuminate\Container\Attributes\Storage; use Illuminate\Container\Attributes\Tag; @@ -354,6 +356,42 @@ public function testTagAttribute() $this->assertEquals([1, 2], iterator_to_array($value)); } + + public function testGetAttribute() + { + $container = new Container; + $container->bind('request', function () { + return Request::create('/', 'GET', [ + 'name' => 'Joe Bloggs', + 'age' => '32', + 'hobbies' => ['Sports'], + ]); + }); + + $data = $container->make(TestGetData::class); + + $this->assertEquals('Joe Bloggs', $data->name); + $this->assertEquals(32, $data->age); + $this->assertEquals(['Sports'], $data->hobbies); + } + + public function testPostAttribute() + { + $container = new Container; + $container->bind('request', function () { + return Request::create('/', 'POST', [ + 'name' => 'Joe Bloggs', + 'age' => '32', + 'hobbies' => ['Sports'], + ]); + }); + + $data = $container->make(TestGetData::class); + + $this->assertEquals('Joe Bloggs', $data->name); + $this->assertEquals(32, $data->age); + $this->assertEquals(['Sports'], $data->hobbies); + } } #[Attribute(Attribute::TARGET_PARAMETER)] @@ -575,3 +613,21 @@ public function __construct( // } } + +final readonly class TestGetData +{ + public function __construct( + #[Get('name')] public string $name, + #[Get('age', 24)] public int $age, + #[Get('hobbies', [])] public array $hobbies, + ) {} +} + +final readonly class TestPostData +{ + public function __construct( + #[Post('name')] public string $name, + #[Post('age', 24)] public int $age, + #[Post('hobbies', [])] public array $hobbies, + ) {} +} From b492e5c80783a98e06d084b141948ad358b9e3d8 Mon Sep 17 00:00:00 2001 From: Jamie York Date: Fri, 4 Jul 2025 23:13:38 +0100 Subject: [PATCH 3/7] fix cs --- tests/Container/ContextualAttributeBindingTest.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/Container/ContextualAttributeBindingTest.php b/tests/Container/ContextualAttributeBindingTest.php index 2b4579d7ff04..c3002e53de73 100644 --- a/tests/Container/ContextualAttributeBindingTest.php +++ b/tests/Container/ContextualAttributeBindingTest.php @@ -620,7 +620,8 @@ public function __construct( #[Get('name')] public string $name, #[Get('age', 24)] public int $age, #[Get('hobbies', [])] public array $hobbies, - ) {} + ) { + } } final readonly class TestPostData @@ -629,5 +630,6 @@ public function __construct( #[Post('name')] public string $name, #[Post('age', 24)] public int $age, #[Post('hobbies', [])] public array $hobbies, - ) {} + ) { + } } From 35922fc20f16710d185207cd03d883456c9f489c Mon Sep 17 00:00:00 2001 From: Jamie York Date: Tue, 8 Jul 2025 22:40:56 +0100 Subject: [PATCH 4/7] query not get --- .../Attributes/{Get.php => Query.php} | 4 +- .../ContextualAttributeBindingTest.php | 38 +++++++++---------- 2 files changed, 19 insertions(+), 23 deletions(-) rename src/Illuminate/Container/Attributes/{Get.php => Query.php} (79%) diff --git a/src/Illuminate/Container/Attributes/Get.php b/src/Illuminate/Container/Attributes/Query.php similarity index 79% rename from src/Illuminate/Container/Attributes/Get.php rename to src/Illuminate/Container/Attributes/Query.php index d2f6e5221044..79a5f465000a 100644 --- a/src/Illuminate/Container/Attributes/Get.php +++ b/src/Illuminate/Container/Attributes/Query.php @@ -7,7 +7,7 @@ use Illuminate\Contracts\Container\ContextualAttribute; #[Attribute(Attribute::TARGET_PARAMETER)] -class Get implements ContextualAttribute +class Query implements ContextualAttribute { /** * Create a new class instance. @@ -21,6 +21,6 @@ public function __construct(public string $key, public mixed $default = null) */ public static function resolve(self $attribute, Container $container): mixed { - return $container->make('request')->get($attribute->key, $attribute->default); + return $container->make('request')->query($attribute->key, $attribute->default); } } diff --git a/tests/Container/ContextualAttributeBindingTest.php b/tests/Container/ContextualAttributeBindingTest.php index c3002e53de73..dc072d5eae4f 100644 --- a/tests/Container/ContextualAttributeBindingTest.php +++ b/tests/Container/ContextualAttributeBindingTest.php @@ -14,7 +14,7 @@ use Illuminate\Container\Attributes\Context; use Illuminate\Container\Attributes\CurrentUser; use Illuminate\Container\Attributes\Database; -use Illuminate\Container\Attributes\Get; +use Illuminate\Container\Attributes\Query; use Illuminate\Container\Attributes\Give; use Illuminate\Container\Attributes\Log; use Illuminate\Container\Attributes\Post; @@ -357,40 +357,36 @@ public function testTagAttribute() $this->assertEquals([1, 2], iterator_to_array($value)); } - public function testGetAttribute() + public function testPostAttribute() { $container = new Container; $container->bind('request', function () { - return Request::create('/', 'GET', [ - 'name' => 'Joe Bloggs', + return Request::create('/', 'POST', [ + 'name' => 'Foo Bar', 'age' => '32', - 'hobbies' => ['Sports'], + 'hobbies' => ['Gaming'], ]); }); - $data = $container->make(TestGetData::class); + $data = $container->make(TestPostData::class); - $this->assertEquals('Joe Bloggs', $data->name); + $this->assertEquals('Foo Bar', $data->name); $this->assertEquals(32, $data->age); - $this->assertEquals(['Sports'], $data->hobbies); + $this->assertEquals(['Gaming'], $data->hobbies); } - public function testPostAttribute() + public function testQueryAttribute() { $container = new Container; $container->bind('request', function () { - return Request::create('/', 'POST', [ - 'name' => 'Joe Bloggs', - 'age' => '32', - 'hobbies' => ['Sports'], - ]); + return Request::create('/?name=Foo+Bar&age=32&hobbies[]=Gaming', 'GET'); }); - $data = $container->make(TestGetData::class); + $data = $container->make(TestQueryData::class); - $this->assertEquals('Joe Bloggs', $data->name); + $this->assertEquals('Foo Bar', $data->name); $this->assertEquals(32, $data->age); - $this->assertEquals(['Sports'], $data->hobbies); + $this->assertEquals(['Gaming'], $data->hobbies); } } @@ -614,12 +610,12 @@ public function __construct( } } -final readonly class TestGetData +final readonly class TestQueryData { public function __construct( - #[Get('name')] public string $name, - #[Get('age', 24)] public int $age, - #[Get('hobbies', [])] public array $hobbies, + #[Query('name')] public string $name, + #[Query('age', 24)] public int $age, + #[Query('hobbies', [])] public array $hobbies, ) { } } From 7354951f58fd0c43a39722536ee9530aebee1152 Mon Sep 17 00:00:00 2001 From: Jamie York Date: Tue, 8 Jul 2025 22:44:11 +0100 Subject: [PATCH 5/7] null key params --- src/Illuminate/Container/Attributes/Post.php | 2 +- src/Illuminate/Container/Attributes/Query.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Container/Attributes/Post.php b/src/Illuminate/Container/Attributes/Post.php index 7c600b3fbfa8..35a245f69782 100644 --- a/src/Illuminate/Container/Attributes/Post.php +++ b/src/Illuminate/Container/Attributes/Post.php @@ -12,7 +12,7 @@ class Post implements ContextualAttribute /** * Create a new class instance. */ - public function __construct(public string $key, public mixed $default = null) + public function __construct(public ?string $key = null, public mixed $default = null) { } diff --git a/src/Illuminate/Container/Attributes/Query.php b/src/Illuminate/Container/Attributes/Query.php index 79a5f465000a..02b4465f1d32 100644 --- a/src/Illuminate/Container/Attributes/Query.php +++ b/src/Illuminate/Container/Attributes/Query.php @@ -12,7 +12,7 @@ class Query implements ContextualAttribute /** * Create a new class instance. */ - public function __construct(public string $key, public mixed $default = null) + public function __construct(public ?string $key = null, public mixed $default = null) { } From 5c9f9ba62af8616a8fd105b5a9e774d1ccb242b9 Mon Sep 17 00:00:00 2001 From: Jamie York Date: Tue, 8 Jul 2025 22:47:30 +0100 Subject: [PATCH 6/7] add input attr --- src/Illuminate/Container/Attributes/Input.php | 26 ++++++++++++++ .../ContextualAttributeBindingTest.php | 36 ++++++++++++++----- 2 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 src/Illuminate/Container/Attributes/Input.php diff --git a/src/Illuminate/Container/Attributes/Input.php b/src/Illuminate/Container/Attributes/Input.php new file mode 100644 index 000000000000..b99eb2f2e29d --- /dev/null +++ b/src/Illuminate/Container/Attributes/Input.php @@ -0,0 +1,26 @@ +make('request')->input($attribute->key, $attribute->default); + } +} diff --git a/tests/Container/ContextualAttributeBindingTest.php b/tests/Container/ContextualAttributeBindingTest.php index dc072d5eae4f..4baee960d541 100644 --- a/tests/Container/ContextualAttributeBindingTest.php +++ b/tests/Container/ContextualAttributeBindingTest.php @@ -14,6 +14,7 @@ use Illuminate\Container\Attributes\Context; use Illuminate\Container\Attributes\CurrentUser; use Illuminate\Container\Attributes\Database; +use Illuminate\Container\Attributes\Input; use Illuminate\Container\Attributes\Query; use Illuminate\Container\Attributes\Give; use Illuminate\Container\Attributes\Log; @@ -357,6 +358,21 @@ public function testTagAttribute() $this->assertEquals([1, 2], iterator_to_array($value)); } + public function testInputAttribute() + { + $container = new Container; + $container->bind('request', function () { + return Request::create('/?name=Foo+Bar', 'POST', [ + 'age' => '32', + ]); + }); + + $data = $container->make(TestInputData::class); + + $this->assertEquals('Foo Bar', $data->name); + $this->assertEquals(32, $data->age); + } + public function testPostAttribute() { $container = new Container; @@ -364,7 +380,6 @@ public function testPostAttribute() return Request::create('/', 'POST', [ 'name' => 'Foo Bar', 'age' => '32', - 'hobbies' => ['Gaming'], ]); }); @@ -372,21 +387,19 @@ public function testPostAttribute() $this->assertEquals('Foo Bar', $data->name); $this->assertEquals(32, $data->age); - $this->assertEquals(['Gaming'], $data->hobbies); } public function testQueryAttribute() { $container = new Container; $container->bind('request', function () { - return Request::create('/?name=Foo+Bar&age=32&hobbies[]=Gaming', 'GET'); + return Request::create('/?name=Foo+Bar&age=32', 'GET'); }); $data = $container->make(TestQueryData::class); $this->assertEquals('Foo Bar', $data->name); $this->assertEquals(32, $data->age); - $this->assertEquals(['Gaming'], $data->hobbies); } } @@ -610,12 +623,20 @@ public function __construct( } } +final readonly class TestInputData +{ + public function __construct( + #[Input('name')] public string $name, + #[Input('age', 24)] public int $age, + ) { + } +} + final readonly class TestQueryData { public function __construct( - #[Query('name')] public string $name, - #[Query('age', 24)] public int $age, - #[Query('hobbies', [])] public array $hobbies, + #[Query('name')] public string $name, + #[Query('age', 24)] public int $age, ) { } } @@ -625,7 +646,6 @@ public function __construct( public function __construct( #[Post('name')] public string $name, #[Post('age', 24)] public int $age, - #[Post('hobbies', [])] public array $hobbies, ) { } } From 337d5b0002bceb3a0cdfa797906b6cbb3b5548e5 Mon Sep 17 00:00:00 2001 From: Jamie York Date: Tue, 8 Jul 2025 22:55:43 +0100 Subject: [PATCH 7/7] fix cs --- tests/Container/ContextualAttributeBindingTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Container/ContextualAttributeBindingTest.php b/tests/Container/ContextualAttributeBindingTest.php index 4baee960d541..04d326cb68df 100644 --- a/tests/Container/ContextualAttributeBindingTest.php +++ b/tests/Container/ContextualAttributeBindingTest.php @@ -14,11 +14,11 @@ use Illuminate\Container\Attributes\Context; use Illuminate\Container\Attributes\CurrentUser; use Illuminate\Container\Attributes\Database; -use Illuminate\Container\Attributes\Input; -use Illuminate\Container\Attributes\Query; use Illuminate\Container\Attributes\Give; +use Illuminate\Container\Attributes\Input; use Illuminate\Container\Attributes\Log; use Illuminate\Container\Attributes\Post; +use Illuminate\Container\Attributes\Query; use Illuminate\Container\Attributes\RouteParameter; use Illuminate\Container\Attributes\Storage; use Illuminate\Container\Attributes\Tag;