diff --git a/UPGRADE-7.0.md b/UPGRADE-7.0.md index ae620a5a7ead..3bf1d36c83b1 100644 --- a/UPGRADE-7.0.md +++ b/UPGRADE-7.0.md @@ -198,6 +198,8 @@ Routing ------- * Add argument `$routeParameters` to `UrlMatcher::handleRouteRequirements()` + * Remove Doctrine annotations support in favor of native attributes + * Change the constructor signature of `AnnotationClassLoader` to `__construct(?string $env = null)`, passing an annotation reader as first argument is not supported anymore Security -------- diff --git a/composer.json b/composer.json index 0a270471df52..b91c62265360 100644 --- a/composer.json +++ b/composer.json @@ -126,7 +126,6 @@ "async-aws/sqs": "^1.0", "async-aws/sns": "^1.0", "cache/integration-tests": "dev-master", - "doctrine/annotations": "^1.13.1|^2", "doctrine/collections": "^1.0|^2.0", "doctrine/data-fixtures": "^1.1", "doctrine/dbal": "^3.6", @@ -159,7 +158,6 @@ "conflict": { "ext-psr": "<1.1|>=2", "async-aws/core": "<1.5", - "doctrine/annotations": "<1.13.1", "doctrine/dbal": "<3.6", "doctrine/orm": "<2.15", "egulias/email-validator": "~3.0.0", diff --git a/src/Symfony/Component/Routing/Annotation/Route.php b/src/Symfony/Component/Routing/Annotation/Route.php index 26b5853a119a..712ce5d50bb3 100644 --- a/src/Symfony/Component/Routing/Annotation/Route.php +++ b/src/Symfony/Component/Routing/Annotation/Route.php @@ -12,12 +12,6 @@ namespace Symfony\Component\Routing\Annotation; /** - * Annotation class for @Route(). - * - * @Annotation - * @NamedArgumentConstructor - * @Target({"CLASS", "METHOD"}) - * * @author Fabien Potencier * @author Alexander M. Turek */ diff --git a/src/Symfony/Component/Routing/CHANGELOG.md b/src/Symfony/Component/Routing/CHANGELOG.md index 5ef8a9af8b3c..31c6bc2587b7 100644 --- a/src/Symfony/Component/Routing/CHANGELOG.md +++ b/src/Symfony/Component/Routing/CHANGELOG.md @@ -5,6 +5,8 @@ CHANGELOG --- * Add argument `$routeParameters` to `UrlMatcher::handleRouteRequirements()` + * Remove Doctrine annotations support in favor of native attributes + * Change the constructor signature of `AnnotationClassLoader` to `__construct(?string $env = null)`, passing an annotation reader as first argument is not supported anymore 6.4 --- diff --git a/src/Symfony/Component/Routing/Loader/AnnotationClassLoader.php b/src/Symfony/Component/Routing/Loader/AnnotationClassLoader.php index 66e3df3b7696..8e5d01a68f56 100644 --- a/src/Symfony/Component/Routing/Loader/AnnotationClassLoader.php +++ b/src/Symfony/Component/Routing/Loader/AnnotationClassLoader.php @@ -11,7 +11,6 @@ namespace Symfony\Component\Routing\Loader; -use Doctrine\Common\Annotations\Reader; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\Config\Loader\LoaderResolverInterface; use Symfony\Component\Config\Resource\FileResource; @@ -52,49 +51,12 @@ */ abstract class AnnotationClassLoader implements LoaderInterface { - /** - * @var Reader|null - * - * @deprecated in Symfony 6.4, this property will be removed in Symfony 7. - */ - protected $reader; - - /** - * @var string|null - */ - protected $env; - - /** - * @var string - */ - protected $routeAnnotationClass = RouteAnnotation::class; - - /** - * @var int - */ - protected $defaultRouteIndex = 0; - - private bool $hasDeprecatedAnnotations = false; - - /** - * @param string|null $env - */ - public function __construct($env = null) - { - if ($env instanceof Reader || null === $env && \func_num_args() > 1 && null !== func_get_arg(1)) { - trigger_deprecation('symfony/routing', '6.4', 'Passing an instance of "%s" as first and the environment as second argument to "%s" is deprecated. Pass the environment as first argument instead.', Reader::class, __METHOD__); + protected string $routeAnnotationClass = RouteAnnotation::class; + protected int $defaultRouteIndex = 0; - $this->reader = $env; - $env = \func_num_args() > 1 ? func_get_arg(1) : null; - } - - if (\is_string($env) || null === $env) { - $this->env = $env; - } elseif ($env instanceof \Stringable || \is_scalar($env)) { - $this->env = (string) $env; - } else { - throw new \TypeError(__METHOD__.sprintf(': Parameter $env was expected to be a string or null, "%s" given.', get_debug_type($env))); - } + public function __construct( + protected readonly ?string $env = null, + ) { } /** @@ -121,48 +83,38 @@ public function load(mixed $class, string $type = null): RouteCollection throw new \InvalidArgumentException(sprintf('Annotations from class "%s" cannot be read as it is abstract.', $class->getName())); } - $this->hasDeprecatedAnnotations = false; - - try { - $globals = $this->getGlobals($class); - $collection = new RouteCollection(); - $collection->addResource(new FileResource($class->getFileName())); - if ($globals['env'] && $this->env !== $globals['env']) { - return $collection; - } - $fqcnAlias = false; - foreach ($class->getMethods() as $method) { - $this->defaultRouteIndex = 0; - $routeNamesBefore = array_keys($collection->all()); - foreach ($this->getAnnotations($method) as $annot) { - $this->addRoute($collection, $annot, $globals, $class, $method); - if ('__invoke' === $method->name) { - $fqcnAlias = true; - } - } - - if (1 === $collection->count() - \count($routeNamesBefore)) { - $newRouteName = current(array_diff(array_keys($collection->all()), $routeNamesBefore)); - $collection->addAlias(sprintf('%s::%s', $class->name, $method->name), $newRouteName); - } - } - if (0 === $collection->count() && $class->hasMethod('__invoke')) { - $globals = $this->resetGlobals(); - foreach ($this->getAnnotations($class) as $annot) { - $this->addRoute($collection, $annot, $globals, $class, $class->getMethod('__invoke')); + $globals = $this->getGlobals($class); + $collection = new RouteCollection(); + $collection->addResource(new FileResource($class->getFileName())); + if ($globals['env'] && $this->env !== $globals['env']) { + return $collection; + } + $fqcnAlias = false; + foreach ($class->getMethods() as $method) { + $this->defaultRouteIndex = 0; + $routeNamesBefore = array_keys($collection->all()); + foreach ($this->getAnnotations($method) as $annot) { + $this->addRoute($collection, $annot, $globals, $class, $method); + if ('__invoke' === $method->name) { $fqcnAlias = true; } } - if ($fqcnAlias && 1 === $collection->count()) { - $collection->addAlias($class->name, $invokeRouteName = key($collection->all())); - $collection->addAlias(sprintf('%s::__invoke', $class->name), $invokeRouteName); - } - if ($this->hasDeprecatedAnnotations) { - trigger_deprecation('symfony/routing', '6.4', 'Class "%s" uses Doctrine Annotations to configure routes, which is deprecated. Use PHP attributes instead.', $class->getName()); + if (1 === $collection->count() - \count($routeNamesBefore)) { + $newRouteName = current(array_diff(array_keys($collection->all()), $routeNamesBefore)); + $collection->addAlias(sprintf('%s::%s', $class->name, $method->name), $newRouteName); } - } finally { - $this->hasDeprecatedAnnotations = false; + } + if (0 === $collection->count() && $class->hasMethod('__invoke')) { + $globals = $this->resetGlobals(); + foreach ($this->getAnnotations($class) as $annot) { + $this->addRoute($collection, $annot, $globals, $class, $class->getMethod('__invoke')); + $fqcnAlias = true; + } + } + if ($fqcnAlias && 1 === $collection->count()) { + $collection->addAlias($class->name, $invokeRouteName = key($collection->all())); + $collection->addAlias(sprintf('%s::__invoke', $class->name), $invokeRouteName); } return $collection; @@ -291,15 +243,9 @@ protected function getGlobals(\ReflectionClass $class): array { $globals = $this->resetGlobals(); - $annot = null; if ($attribute = $class->getAttributes($this->routeAnnotationClass, \ReflectionAttribute::IS_INSTANCEOF)[0] ?? null) { $annot = $attribute->newInstance(); - } - if (!$annot && $annot = $this->reader?->getClassAnnotation($class, $this->routeAnnotationClass)) { - $this->hasDeprecatedAnnotations = true; - } - if ($annot) { if (null !== $annot->getName()) { $globals['name'] = $annot->getName(); } @@ -387,21 +333,5 @@ private function getAnnotations(\ReflectionClass|\ReflectionMethod $reflection): foreach ($reflection->getAttributes($this->routeAnnotationClass, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) { yield $attribute->newInstance(); } - - if (!$this->reader) { - return; - } - - $annotations = $reflection instanceof \ReflectionClass - ? $this->reader->getClassAnnotations($reflection) - : $this->reader->getMethodAnnotations($reflection); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $this->routeAnnotationClass) { - $this->hasDeprecatedAnnotations = true; - - yield $annotation; - } - } } } diff --git a/src/Symfony/Component/Routing/Tests/Annotation/RouteTest.php b/src/Symfony/Component/Routing/Tests/Annotation/RouteTest.php index de671ed961e8..817a14a202b3 100644 --- a/src/Symfony/Component/Routing/Tests/Annotation/RouteTest.php +++ b/src/Symfony/Component/Routing/Tests/Annotation/RouteTest.php @@ -11,49 +11,19 @@ namespace Symfony\Component\Routing\Tests\Annotation; -use Doctrine\Common\Annotations\AnnotationReader; use PHPUnit\Framework\TestCase; use Symfony\Component\Routing\Annotation\Route; -use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\FooController; -use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\FooController as FooAttributesController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\FooController; class RouteTest extends TestCase { - private function getMethodAnnotation(string $method, bool $attributes): Route - { - $class = $attributes ? FooAttributesController::class : FooController::class; - $reflection = new \ReflectionMethod($class, $method); - - if ($attributes) { - $attributes = $reflection->getAttributes(Route::class); - $route = $attributes[0]->newInstance(); - } else { - $reader = new AnnotationReader(); - $route = $reader->getMethodAnnotation($reflection, Route::class); - } - - if (!$route instanceof Route) { - throw new \Exception('Can\'t parse annotation'); - } - - return $route; - } - /** * @dataProvider getValidParameters */ - public function testLoadFromAttribute(string $methodName, string $getter, $expectedReturn) + public function testLoadFromAttribute(string $methodName, string $getter, mixed $expectedReturn) { - $route = $this->getMethodAnnotation($methodName, true); - $this->assertEquals($route->$getter(), $expectedReturn); - } + $route = (new \ReflectionMethod(FooController::class, $methodName))->getAttributes(Route::class)[0]->newInstance(); - /** - * @dataProvider getValidParameters - */ - public function testLoadFromDoctrineAnnotation(string $methodName, string $getter, $expectedReturn) - { - $route = $this->getMethodAnnotation($methodName, false); $this->assertEquals($route->$getter(), $expectedReturn); } diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/AbstractClassController.php b/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/AbstractClassController.php deleted file mode 100644 index 50576bcf1027..000000000000 --- a/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/AbstractClassController.php +++ /dev/null @@ -1,7 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures; - -use Symfony\Component\Routing\Annotation\Route; - -/** - * @Route("/1", name="route1", schemes={"https"}, methods={"GET"}) - * @Route("/2", name="route2", schemes={"https"}, methods={"GET"}) - */ -class BazClass -{ - public function __invoke() - { - } -} diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/DefaultValueController.php b/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/DefaultValueController.php deleted file mode 100644 index c5e0c20d356e..000000000000 --- a/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/DefaultValueController.php +++ /dev/null @@ -1,39 +0,0 @@ -}", name="hello_without_default") - * @Route("/hello/{name<\w+>?Symfony}", name="hello_with_default") - */ - public function hello(string $name = 'World') - { - } - - /** - * @Route("/enum/{default}", name="string_enum_action") - */ - public function stringEnumAction(TestStringBackedEnum $default = TestStringBackedEnum::Diamonds) - { - } - - /** - * @Route("/enum/{default<\d+>}", name="int_enum_action") - */ - public function intEnumAction(TestIntBackedEnum $default = TestIntBackedEnum::Diamonds) - { - } -} diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/EncodingClass.php b/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/EncodingClass.php deleted file mode 100644 index 52c7b267276a..000000000000 --- a/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/EncodingClass.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures; - -use Symfony\Component\Routing\Annotation\Route; - -/** - * @Route("/defaults", methods="GET", schemes="https", locale="g_locale", format="g_format") - */ -class GlobalDefaultsClass -{ - /** - * @Route("/specific-locale", name="specific_locale", locale="s_locale") - */ - public function locale() - { - } - - /** - * @Route("/specific-format", name="specific_format", format="s_format") - */ - public function format() - { - } - - /** - * @Route("/redundant-method", name="redundant_method", methods="GET") - */ - public function redundantMethod() - { - } - - /** - * @Route("/redundant-scheme", name="redundant_scheme", methods="https") - */ - public function redundantScheme() - { - } -} diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/InvokableController.php b/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/InvokableController.php deleted file mode 100644 index c70793a81d7a..000000000000 --- a/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/InvokableController.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures; - -use Symfony\Component\Routing\Annotation\Route; - -/** - * @Route("/", requirements={"foo", "\d+"}) - */ -class RequirementsWithoutPlaceholderNameController -{ - /** - * @Route("/{foo}", name="foo", requirements={"foo", "\d+"}) - */ - public function foo() - { - } -} diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/RouteWithEnv.php b/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/RouteWithEnv.php deleted file mode 100644 index dcc94e7a174e..000000000000 --- a/src/Symfony/Component/Routing/Tests/Fixtures/AnnotationFixtures/RouteWithEnv.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Fixtures\OtherAnnotatedClasses; - -trait AnonymousClassInTrait -{ - public function test() - { - return new class() { - public function foo() - { - } - }; - } -} diff --git a/src/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTestCase.php b/src/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.php similarity index 63% rename from src/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTestCase.php rename to src/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.php index 1b43aedc5a7d..b3509a8e11b5 100644 --- a/src/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTestCase.php +++ b/src/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.php @@ -14,11 +14,42 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Routing\Alias; use Symfony\Component\Routing\Loader\AnnotationClassLoader; -use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\AbstractClassController; - -abstract class AnnotationClassLoaderTestCase extends TestCase +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\AbstractClassController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\ActionPathController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\BazClass; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\DefaultValueController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\EncodingClass; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\ExplicitLocalizedActionPathController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\GlobalDefaultsClass; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\InvokableController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\InvokableLocalizedController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\InvokableMethodController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\LocalizedActionPathController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\LocalizedMethodActionControllers; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\LocalizedPrefixLocalizedActionController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\LocalizedPrefixMissingLocaleActionController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\LocalizedPrefixMissingRouteLocaleActionController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\LocalizedPrefixWithRouteWithoutLocale; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\MethodActionControllers; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\MethodsAndSchemes; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\MissingRouteNameController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\NothingButNameController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\PrefixedActionLocalizedRouteController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\PrefixedActionPathController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\RequirementsWithoutPlaceholderNameController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\RouteWithEnv; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\RouteWithPrefixController; +use Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\Utf8ActionControllers; +use Symfony\Component\Routing\Tests\Fixtures\TraceableAnnotationClassLoader; + +class AnnotationClassLoaderTest extends TestCase { - protected AnnotationClassLoader $loader; + private AnnotationClassLoader $loader; + + protected function setUp(string $env = null): void + { + $this->loader = new TraceableAnnotationClassLoader($env); + } /** * @dataProvider provideTestSupportsChecksResource @@ -50,10 +81,10 @@ public function testSupportsChecksTypeIfSpecified() public function testSimplePathRoute() { - $routes = $this->loader->load($this->getNamespace().'\ActionPathController'); + $routes = $this->loader->load(ActionPathController::class); $this->assertCount(1, $routes); $this->assertEquals('/path', $routes->get('action')->getPath()); - $this->assertEquals(new Alias('action'), $routes->getAlias($this->getNamespace().'\ActionPathController::action')); + $this->assertEquals(new Alias('action'), $routes->getAlias('Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures' .'\ActionPathController::action')); } public function testRequirementsWithoutPlaceholderName() @@ -61,34 +92,34 @@ public function testRequirementsWithoutPlaceholderName() $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('A placeholder name must be a string (0 given). Did you forget to specify the placeholder key for the requirement "foo"'); - $this->loader->load($this->getNamespace().'\RequirementsWithoutPlaceholderNameController'); + $this->loader->load(RequirementsWithoutPlaceholderNameController::class); } public function testInvokableControllerLoader() { - $routes = $this->loader->load($this->getNamespace().'\InvokableController'); + $routes = $this->loader->load(InvokableController::class); $this->assertCount(1, $routes); $this->assertEquals('/here', $routes->get('lol')->getPath()); $this->assertEquals(['GET', 'POST'], $routes->get('lol')->getMethods()); $this->assertEquals(['https'], $routes->get('lol')->getSchemes()); - $this->assertEquals(new Alias('lol'), $routes->getAlias($this->getNamespace().'\InvokableController')); - $this->assertEquals(new Alias('lol'), $routes->getAlias($this->getNamespace().'\InvokableController::__invoke')); + $this->assertEquals(new Alias('lol'), $routes->getAlias(InvokableController::class)); + $this->assertEquals(new Alias('lol'), $routes->getAlias('Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\InvokableController::__invoke')); } public function testInvokableMethodControllerLoader() { - $routes = $this->loader->load($this->getNamespace().'\InvokableMethodController'); + $routes = $this->loader->load(InvokableMethodController::class); $this->assertCount(1, $routes); $this->assertEquals('/here', $routes->get('lol')->getPath()); $this->assertEquals(['GET', 'POST'], $routes->get('lol')->getMethods()); $this->assertEquals(['https'], $routes->get('lol')->getSchemes()); - $this->assertEquals(new Alias('lol'), $routes->getAlias($this->getNamespace().'\InvokableMethodController')); - $this->assertEquals(new Alias('lol'), $routes->getAlias($this->getNamespace().'\InvokableMethodController::__invoke')); + $this->assertEquals(new Alias('lol'), $routes->getAlias(InvokableMethodController::class)); + $this->assertEquals(new Alias('lol'), $routes->getAlias('Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\InvokableMethodController::__invoke')); } public function testInvokableLocalizedControllerLoading() { - $routes = $this->loader->load($this->getNamespace().'\InvokableLocalizedController'); + $routes = $this->loader->load(InvokableLocalizedController::class); $this->assertCount(2, $routes); $this->assertEquals('/here', $routes->get('action.en')->getPath()); $this->assertEquals('/hier', $routes->get('action.nl')->getPath()); @@ -96,7 +127,7 @@ public function testInvokableLocalizedControllerLoading() public function testLocalizedPathRoutes() { - $routes = $this->loader->load($this->getNamespace().'\LocalizedActionPathController'); + $routes = $this->loader->load(LocalizedActionPathController::class); $this->assertCount(2, $routes); $this->assertEquals('/path', $routes->get('action.en')->getPath()); $this->assertEquals('/pad', $routes->get('action.nl')->getPath()); @@ -107,7 +138,7 @@ public function testLocalizedPathRoutes() public function testLocalizedPathRoutesWithExplicitPathPropety() { - $routes = $this->loader->load($this->getNamespace().'\ExplicitLocalizedActionPathController'); + $routes = $this->loader->load(ExplicitLocalizedActionPathController::class); $this->assertCount(2, $routes); $this->assertEquals('/path', $routes->get('action.en')->getPath()); $this->assertEquals('/pad', $routes->get('action.nl')->getPath()); @@ -115,7 +146,7 @@ public function testLocalizedPathRoutesWithExplicitPathPropety() public function testDefaultValuesForMethods() { - $routes = $this->loader->load($this->getNamespace().'\DefaultValueController'); + $routes = $this->loader->load(DefaultValueController::class); $this->assertCount(5, $routes); $this->assertEquals('/{default}/path', $routes->get('action')->getPath()); $this->assertEquals('value', $routes->get('action')->getDefault('default')); @@ -127,17 +158,17 @@ public function testDefaultValuesForMethods() public function testMethodActionControllers() { - $routes = $this->loader->load($this->getNamespace().'\MethodActionControllers'); + $routes = $this->loader->load(MethodActionControllers::class); $this->assertSame(['put', 'post'], array_keys($routes->all())); $this->assertEquals('/the/path', $routes->get('put')->getPath()); $this->assertEquals('/the/path', $routes->get('post')->getPath()); - $this->assertEquals(new Alias('post'), $routes->getAlias($this->getNamespace().'\MethodActionControllers::post')); - $this->assertEquals(new Alias('put'), $routes->getAlias($this->getNamespace().'\MethodActionControllers::put')); + $this->assertEquals(new Alias('post'), $routes->getAlias('Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures' .'\MethodActionControllers::post')); + $this->assertEquals(new Alias('put'), $routes->getAlias('Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures' .'\MethodActionControllers::put')); } public function testInvokableClassRouteLoadWithMethodAnnotation() { - $routes = $this->loader->load($this->getNamespace().'\LocalizedMethodActionControllers'); + $routes = $this->loader->load(LocalizedMethodActionControllers::class); $this->assertCount(4, $routes); $this->assertEquals('/the/path', $routes->get('put.en')->getPath()); $this->assertEquals('/the/path', $routes->get('post.en')->getPath()); @@ -145,7 +176,7 @@ public function testInvokableClassRouteLoadWithMethodAnnotation() public function testGlobalDefaultsRoutesLoadWithAnnotation() { - $routes = $this->loader->load($this->getNamespace().'\GlobalDefaultsClass'); + $routes = $this->loader->load(GlobalDefaultsClass::class); $this->assertCount(4, $routes); $specificLocaleRoute = $routes->get('specific_locale'); @@ -166,7 +197,7 @@ public function testGlobalDefaultsRoutesLoadWithAnnotation() public function testUtf8RoutesLoadWithAnnotation() { - $routes = $this->loader->load($this->getNamespace().'\Utf8ActionControllers'); + $routes = $this->loader->load(Utf8ActionControllers::class); $this->assertSame(['one', 'two'], array_keys($routes->all())); $this->assertTrue($routes->get('one')->getOption('utf8'), 'The route must accept utf8'); $this->assertFalse($routes->get('two')->getOption('utf8'), 'The route must not accept utf8'); @@ -174,7 +205,7 @@ public function testUtf8RoutesLoadWithAnnotation() public function testRouteWithPathWithPrefix() { - $routes = $this->loader->load($this->getNamespace().'\PrefixedActionPathController'); + $routes = $this->loader->load(PrefixedActionPathController::class); $this->assertCount(1, $routes); $route = $routes->get('action'); $this->assertEquals('/prefix/path', $route->getPath()); @@ -184,7 +215,7 @@ public function testRouteWithPathWithPrefix() public function testLocalizedRouteWithPathWithPrefix() { - $routes = $this->loader->load($this->getNamespace().'\PrefixedActionLocalizedRouteController'); + $routes = $this->loader->load(PrefixedActionLocalizedRouteController::class); $this->assertCount(2, $routes); $this->assertEquals('/prefix/path', $routes->get('action.en')->getPath()); $this->assertEquals('/prefix/pad', $routes->get('action.nl')->getPath()); @@ -192,7 +223,7 @@ public function testLocalizedRouteWithPathWithPrefix() public function testLocalizedPrefixLocalizedRoute() { - $routes = $this->loader->load($this->getNamespace().'\LocalizedPrefixLocalizedActionController'); + $routes = $this->loader->load(LocalizedPrefixLocalizedActionController::class); $this->assertCount(2, $routes); $this->assertEquals('/nl/actie', $routes->get('action.nl')->getPath()); $this->assertEquals('/en/action', $routes->get('action.en')->getPath()); @@ -200,7 +231,7 @@ public function testLocalizedPrefixLocalizedRoute() public function testInvokableClassMultipleRouteLoad() { - $routeCollection = $this->loader->load($this->getNamespace().'\BazClass'); + $routeCollection = $this->loader->load(BazClass::class); $route = $routeCollection->get('route1'); $this->assertSame('/1', $route->getPath(), '->load preserves class route path'); @@ -217,27 +248,27 @@ public function testInvokableClassMultipleRouteLoad() public function testMissingPrefixLocale() { $this->expectException(\LogicException::class); - $this->expectExceptionMessage(sprintf('Route to "action" with locale "en" is missing a corresponding prefix in class "%s\LocalizedPrefixMissingLocaleActionController".', $this->getNamespace())); - $this->loader->load($this->getNamespace().'\LocalizedPrefixMissingLocaleActionController'); + $this->expectExceptionMessage('Route to "action" with locale "en" is missing a corresponding prefix in class "Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\LocalizedPrefixMissingLocaleActionController".'); + $this->loader->load(LocalizedPrefixMissingLocaleActionController::class); } public function testMissingRouteLocale() { $this->expectException(\LogicException::class); - $this->expectExceptionMessage(sprintf('Route to "%s\LocalizedPrefixMissingRouteLocaleActionController::action" is missing paths for locale(s) "en".', $this->getNamespace())); - $this->loader->load($this->getNamespace().'\LocalizedPrefixMissingRouteLocaleActionController'); + $this->expectExceptionMessage('Route to "Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\LocalizedPrefixMissingRouteLocaleActionController::action" is missing paths for locale(s) "en".'); + $this->loader->load(LocalizedPrefixMissingRouteLocaleActionController::class); } public function testRouteWithoutName() { - $routes = $this->loader->load($this->getNamespace().'\MissingRouteNameController')->all(); + $routes = $this->loader->load(MissingRouteNameController::class)->all(); $this->assertCount(1, $routes); $this->assertEquals('/path', reset($routes)->getPath()); } public function testNothingButName() { - $routes = $this->loader->load($this->getNamespace().'\NothingButNameController')->all(); + $routes = $this->loader->load(NothingButNameController::class)->all(); $this->assertCount(1, $routes); $this->assertEquals('/', reset($routes)->getPath()); } @@ -256,7 +287,7 @@ public function testLoadingAbstractClass() public function testLocalizedPrefixWithoutRouteLocale() { - $routes = $this->loader->load($this->getNamespace().'\LocalizedPrefixWithRouteWithoutLocale'); + $routes = $this->loader->load(LocalizedPrefixWithRouteWithoutLocale::class); $this->assertCount(2, $routes); $this->assertEquals('/en/suffix', $routes->get('action.en')->getPath()); $this->assertEquals('/nl/suffix', $routes->get('action.nl')->getPath()); @@ -264,25 +295,25 @@ public function testLocalizedPrefixWithoutRouteLocale() public function testLoadingRouteWithPrefix() { - $routes = $this->loader->load($this->getNamespace().'\RouteWithPrefixController'); + $routes = $this->loader->load(RouteWithPrefixController::class); $this->assertCount(1, $routes); $this->assertEquals('/prefix/path', $routes->get('action')->getPath()); } public function testWhenEnv() { - $routes = $this->loader->load($this->getNamespace().'\RouteWithEnv'); + $routes = $this->loader->load(RouteWithEnv::class); $this->assertCount(0, $routes); $this->setUp('some-env'); - $routes = $this->loader->load($this->getNamespace().'\RouteWithEnv'); + $routes = $this->loader->load(RouteWithEnv::class); $this->assertCount(1, $routes); $this->assertSame('/path', $routes->get('action')->getPath()); } public function testMethodsAndSchemes() { - $routes = $this->loader->load($this->getNamespace().'\MethodsAndSchemes'); + $routes = $this->loader->load(MethodsAndSchemes::class); $this->assertSame(['GET', 'POST'], $routes->get('array_many')->getMethods()); $this->assertSame(['http', 'https'], $routes->get('array_many')->getSchemes()); @@ -292,5 +323,12 @@ public function testMethodsAndSchemes() $this->assertSame(['https'], $routes->get('string')->getSchemes()); } - abstract protected function getNamespace(): string; + public function testDefaultRouteName() + { + $routeCollection = $this->loader->load(EncodingClass::class); + $defaultName = array_keys($routeCollection->all())[0]; + + $this->assertSame('symfony_component_routing_tests_fixtures_attributefixtures_encodingclass_routeàction', $defaultName); + } + } diff --git a/src/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderWithAnnotationsTest.php b/src/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderWithAnnotationsTest.php deleted file mode 100644 index f53e4e3ef3ba..000000000000 --- a/src/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderWithAnnotationsTest.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Loader; - -use Doctrine\Common\Annotations\AnnotationReader; -use Symfony\Component\Routing\Tests\Fixtures\TraceableAnnotationClassLoader; - -/** - * @group legacy - */ -class AnnotationClassLoaderWithAnnotationsTest extends AnnotationClassLoaderTestCase -{ - protected function setUp(string $env = null): void - { - $reader = new AnnotationReader(); - $this->loader = new TraceableAnnotationClassLoader($reader, $env); - } - - public function testDefaultRouteName() - { - $routeCollection = $this->loader->load($this->getNamespace().'\EncodingClass'); - $defaultName = array_keys($routeCollection->all())[0]; - - $this->assertSame('symfony_component_routing_tests_fixtures_annotationfixtures_encodingclass_routeàction', $defaultName); - } - - protected function getNamespace(): string - { - return 'Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures'; - } -} diff --git a/src/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderWithAttributesTest.php b/src/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderWithAttributesTest.php deleted file mode 100644 index 2fe0f903189f..000000000000 --- a/src/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderWithAttributesTest.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Loader; - -use Symfony\Component\Routing\Tests\Fixtures\TraceableAnnotationClassLoader; - -class AnnotationClassLoaderWithAttributesTest extends AnnotationClassLoaderTestCase -{ - protected function setUp(string $env = null): void - { - $this->loader = new TraceableAnnotationClassLoader($env); - } - - public function testDefaultRouteName() - { - $routeCollection = $this->loader->load($this->getNamespace().'\EncodingClass'); - $defaultName = array_keys($routeCollection->all())[0]; - - $this->assertSame('symfony_component_routing_tests_fixtures_attributefixtures_encodingclass_routeàction', $defaultName); - } - - protected function getNamespace(): string - { - return 'Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures'; - } -} diff --git a/src/Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php b/src/Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php index d92760ae729c..8451430ce070 100644 --- a/src/Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php +++ b/src/Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php @@ -11,7 +11,6 @@ namespace Symfony\Component\Routing\Tests\Loader; -use Doctrine\Common\Annotations\AnnotationReader; use PHPUnit\Framework\TestCase; use Symfony\Component\Config\FileLocator; use Symfony\Component\Routing\Loader\AnnotationFileLoader; @@ -65,18 +64,6 @@ public function testLoadVariadic() self::assertSame([VariadicClass::class], $this->classLoader->foundClasses); } - /** - * @group legacy - */ - public function testLoadAnonymousClass() - { - $this->classLoader = new TraceableAnnotationClassLoader(new AnnotationReader()); - $this->loader = new AnnotationFileLoader(new FileLocator(), $this->classLoader); - - self::assertCount(0, $this->loader->load(__DIR__.'/../Fixtures/OtherAnnotatedClasses/AnonymousClassInTrait.php')); - self::assertSame([], $this->classLoader->foundClasses); - } - public function testLoadAbstractClass() { self::assertNull($this->loader->load(__DIR__.'/../Fixtures/AnnotatedClasses/AbstractClass.php')); diff --git a/src/Symfony/Component/Routing/composer.json b/src/Symfony/Component/Routing/composer.json index a67c957752f9..1a099d823859 100644 --- a/src/Symfony/Component/Routing/composer.json +++ b/src/Symfony/Component/Routing/composer.json @@ -24,11 +24,9 @@ "symfony/yaml": "^6.4|^7.0", "symfony/expression-language": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", - "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3" }, "conflict": { - "doctrine/annotations": "<1.12", "symfony/config": "<6.4", "symfony/dependency-injection": "<6.4", "symfony/yaml": "<6.4" 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