diff --git a/src/Symfony/Component/HttpKernel/CHANGELOG.md b/src/Symfony/Component/HttpKernel/CHANGELOG.md index 8aceb90c862f7..cdb4e5a06b321 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 64063abf25dde..c90b7706f24a4 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 d07d886db0e5d..239b00512f91d 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 3f53847bac609..ef3ef7ad9e96f 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 967d0168ac4d2..bee08cdd785b1 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 0000000000000..863a13e04fac0 --- /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 0385a07e64b4f..8f73cbdf84cf3 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() { } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy