diff --git a/src/Symfony/Component/HttpKernel/CHANGELOG.md b/src/Symfony/Component/HttpKernel/CHANGELOG.md index 8aceb90c862f..cdb4e5a06b32 100644 --- a/src/Symfony/Component/HttpKernel/CHANGELOG.md +++ b/src/Symfony/Component/HttpKernel/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +6.4 +--- + + * Add optional `$className` parameter to `ControllerEvent::getAttributes()` + 6.3 --- diff --git a/src/Symfony/Component/HttpKernel/Event/ControllerArgumentsEvent.php b/src/Symfony/Component/HttpKernel/Event/ControllerArgumentsEvent.php index 64063abf25dd..c90b7706f24a 100644 --- a/src/Symfony/Component/HttpKernel/Event/ControllerArgumentsEvent.php +++ b/src/Symfony/Component/HttpKernel/Event/ControllerArgumentsEvent.php @@ -94,10 +94,16 @@ public function getNamedArguments(): array } /** - * @return array> + * @template T of class-string|null + * + * @param T $className + * + * @return array>|list + * + * @psalm-return (T is null ? array> : list) */ - public function getAttributes(): array + public function getAttributes(string $className = null): array { - return $this->controllerEvent->getAttributes(); + return $this->controllerEvent->getAttributes($className); } } diff --git a/src/Symfony/Component/HttpKernel/Event/ControllerEvent.php b/src/Symfony/Component/HttpKernel/Event/ControllerEvent.php index d07d886db0e5..239b00512f91 100644 --- a/src/Symfony/Component/HttpKernel/Event/ControllerEvent.php +++ b/src/Symfony/Component/HttpKernel/Event/ControllerEvent.php @@ -79,12 +79,18 @@ public function setController(callable $controller, array $attributes = null): v } /** - * @return array> + * @template T of class-string|null + * + * @param T $className + * + * @return array>|list + * + * @psalm-return (T is null ? array> : list) */ - public function getAttributes(): array + public function getAttributes(string $className = null): array { if (isset($this->attributes)) { - return $this->attributes; + return null === $className ? $this->attributes : $this->attributes[$className] ?? []; } if (\is_array($this->controller) && method_exists(...$this->controller)) { @@ -102,6 +108,6 @@ public function getAttributes(): array } } - return $this->attributes; + return null === $className ? $this->attributes : $this->attributes[$className] ?? []; } } diff --git a/src/Symfony/Component/HttpKernel/Tests/Event/ControllerArgumentsEventTest.php b/src/Symfony/Component/HttpKernel/Tests/Event/ControllerArgumentsEventTest.php index 3f53847bac60..ef3ef7ad9e96 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Event/ControllerArgumentsEventTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Event/ControllerArgumentsEventTest.php @@ -17,6 +17,7 @@ use Symfony\Component\HttpKernel\Event\ControllerEvent; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\Component\HttpKernel\Tests\Fixtures\Attribute\Bar; +use Symfony\Component\HttpKernel\Tests\Fixtures\Attribute\Baz; use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\AttributeController; use Symfony\Component\HttpKernel\Tests\TestHttpKernel; @@ -51,6 +52,9 @@ public function testGetAttributes() new Bar('class'), new Bar('method'), ], + Baz::class => [ + new Baz(), + ], ]; $this->assertEquals($expected, $event->getAttributes()); @@ -61,4 +65,27 @@ public function testGetAttributes() $this->assertEquals($expected, $event->getAttributes()); $this->assertSame($controllerEvent->getAttributes(), $event->getAttributes()); } + + public function testGetAttributesByClassName() + { + $controller = new AttributeController(); + $request = new Request(); + + $controllerEvent = new ControllerEvent(new TestHttpKernel(), $controller, $request, HttpKernelInterface::MAIN_REQUEST); + + $event = new ControllerArgumentsEvent(new TestHttpKernel(), $controllerEvent, ['test'], new Request(), HttpKernelInterface::MAIN_REQUEST); + + $expected = [ + new Bar('class'), + new Bar('method'), + ]; + + $this->assertEquals($expected, $event->getAttributes(Bar::class)); + + $expected[] = new Bar('foo'); + $event->setController($controller, [Bar::class => $expected]); + + $this->assertEquals($expected, $event->getAttributes(Bar::class)); + $this->assertSame($controllerEvent->getAttributes(Bar::class), $event->getAttributes(Bar::class)); + } } diff --git a/src/Symfony/Component/HttpKernel/Tests/Event/ControllerEventTest.php b/src/Symfony/Component/HttpKernel/Tests/Event/ControllerEventTest.php index 967d0168ac4d..bee08cdd785b 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Event/ControllerEventTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Event/ControllerEventTest.php @@ -16,6 +16,7 @@ use Symfony\Component\HttpKernel\Event\ControllerEvent; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\Component\HttpKernel\Tests\Fixtures\Attribute\Bar; +use Symfony\Component\HttpKernel\Tests\Fixtures\Attribute\Baz; use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\AttributeController; use Symfony\Component\HttpKernel\Tests\TestHttpKernel; @@ -33,16 +34,44 @@ public function testGetAttributes(callable $controller) new Bar('class'), new Bar('method'), ], + Baz::class => [ + new Baz(), + ], ]; $this->assertEquals($expected, $event->getAttributes()); } + /** + * @dataProvider provideGetAttributes + */ + public function testGetAttributesByClassName(callable $controller) + { + $event = new ControllerEvent(new TestHttpKernel(), $controller, new Request(), HttpKernelInterface::MAIN_REQUEST); + + $expected = [ + new Bar('class'), + new Bar('method'), + ]; + + $this->assertEquals($expected, $event->getAttributes(Bar::class)); + } + + /** + * @dataProvider provideGetAttributes + */ + public function testGetAttributesByInvalidClassName(callable $controller) + { + $event = new ControllerEvent(new TestHttpKernel(), $controller, new Request(), HttpKernelInterface::MAIN_REQUEST); + + $this->assertEquals([], $event->getAttributes(\stdClass::class)); + } + public static function provideGetAttributes() { yield [[new AttributeController(), '__invoke']]; yield [new AttributeController()]; yield [(new AttributeController())->__invoke(...)]; - yield [#[Bar('class'), Bar('method')] static function () {}]; + yield [#[Bar('class'), Bar('method'), Baz] static function () {}]; } } diff --git a/src/Symfony/Component/HttpKernel/Tests/Fixtures/Attribute/Baz.php b/src/Symfony/Component/HttpKernel/Tests/Fixtures/Attribute/Baz.php new file mode 100644 index 000000000000..863a13e04fac --- /dev/null +++ b/src/Symfony/Component/HttpKernel/Tests/Fixtures/Attribute/Baz.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Tests\Fixtures\Attribute; + +#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::TARGET_FUNCTION | \Attribute::IS_REPEATABLE)] +class Baz +{ +} diff --git a/src/Symfony/Component/HttpKernel/Tests/Fixtures/Controller/AttributeController.php b/src/Symfony/Component/HttpKernel/Tests/Fixtures/Controller/AttributeController.php index 0385a07e64b4..8f73cbdf84cf 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fixtures/Controller/AttributeController.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fixtures/Controller/AttributeController.php @@ -12,12 +12,13 @@ namespace Symfony\Component\HttpKernel\Tests\Fixtures\Controller; use Symfony\Component\HttpKernel\Tests\Fixtures\Attribute\Bar; +use Symfony\Component\HttpKernel\Tests\Fixtures\Attribute\Baz; use Symfony\Component\HttpKernel\Tests\Fixtures\Attribute\Foo; #[Bar('class'), Undefined('class')] class AttributeController { - #[Bar('method'), Undefined('method')] + #[Bar('method'), Baz, Undefined('method')] public function __invoke() { }