Skip to content

Commit 2d5fe14

Browse files
committed
Merge branch '6.4' into 7.0
* 6.4: skip tests that do not work with ICU 71.1 [DependencyInjection] Fix dumping containers with null-referenced services [Routing] Fix removing aliases pointing to removed route in RouteCollection::remove() [VarExporter] Fix lazy ghost trait when using nullsafe operator [Routing] Fix conflicting FQCN aliases with route name Fix legacy class palceholder definitions for static analysis
2 parents 7426e03 + 57ea6d1 commit 2d5fe14

6 files changed

+59
-5
lines changed

Loader/AttributeClassLoader.php

+11-3
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@ public function load(mixed $class, string $type = null): RouteCollection
101101

102102
if (1 === $collection->count() - \count($routeNamesBefore)) {
103103
$newRouteName = current(array_diff(array_keys($collection->all()), $routeNamesBefore));
104-
$collection->addAlias(sprintf('%s::%s', $class->name, $method->name), $newRouteName);
104+
if ($newRouteName !== $aliasName = sprintf('%s::%s', $class->name, $method->name)) {
105+
$collection->addAlias($aliasName, $newRouteName);
106+
}
105107
}
106108
}
107109
if (0 === $collection->count() && $class->hasMethod('__invoke')) {
@@ -112,8 +114,14 @@ public function load(mixed $class, string $type = null): RouteCollection
112114
}
113115
}
114116
if ($fqcnAlias && 1 === $collection->count()) {
115-
$collection->addAlias($class->name, $invokeRouteName = key($collection->all()));
116-
$collection->addAlias(sprintf('%s::__invoke', $class->name), $invokeRouteName);
117+
$invokeRouteName = key($collection->all());
118+
if ($invokeRouteName !== $class->name) {
119+
$collection->addAlias($class->name, $invokeRouteName);
120+
}
121+
122+
if ($invokeRouteName !== $aliasName = sprintf('%s::__invoke', $class->name)) {
123+
$collection->addAlias($aliasName, $invokeRouteName);
124+
}
117125
}
118126

119127
return $collection;

RouteCollection.php

+9-2
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,15 @@ public function get(string $name): ?Route
142142
*/
143143
public function remove(string|array $name): void
144144
{
145-
foreach ((array) $name as $n) {
146-
unset($this->routes[$n], $this->priorities[$n], $this->aliases[$n]);
145+
$names = (array) $name;
146+
foreach ($names as $n) {
147+
unset($this->routes[$n], $this->priorities[$n]);
148+
}
149+
150+
foreach ($this->aliases as $k => $alias) {
151+
if (\in_array($alias->getId(), $names, true)) {
152+
unset($this->aliases[$k]);
153+
}
147154
}
148155
}
149156

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures;
4+
5+
use Symfony\Component\Routing\Attribute\Route;
6+
7+
/**
8+
* @Route("/foobarccc", name="Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\InvokableFQCNAliasConflictController")
9+
*/
10+
class InvokableFQCNAliasConflictController
11+
{
12+
public function __invoke()
13+
{
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures;
4+
5+
use Symfony\Component\Routing\Attribute\Route;
6+
7+
#[Route(path: '/foobarccc', name: self::class)]
8+
class InvokableFQCNAliasConflictController
9+
{
10+
public function __invoke()
11+
{
12+
}
13+
}

Tests/Loader/AttributeClassLoaderTestCase.php

+9
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,15 @@ public function testInvokableControllerLoader()
9999
$this->assertEquals(new Alias('lol'), $routes->getAlias('Symfony\Component\Routing\Tests\Fixtures\AttributeFixtures\InvokableController::__invoke'));
100100
}
101101

102+
public function testInvokableFQCNAliasConflictController()
103+
{
104+
$routes = $this->loader->load($this->getNamespace().'\InvokableFQCNAliasConflictController');
105+
$this->assertCount(1, $routes);
106+
$this->assertEquals('/foobarccc', $routes->get($this->getNamespace().'\InvokableFQCNAliasConflictController')->getPath());
107+
$this->assertNull($routes->getAlias($this->getNamespace().'\InvokableFQCNAliasConflictController'));
108+
$this->assertEquals(new Alias($this->getNamespace().'\InvokableFQCNAliasConflictController'), $routes->getAlias($this->getNamespace().'\InvokableFQCNAliasConflictController::__invoke'));
109+
}
110+
102111
public function testInvokableMethodControllerLoader()
103112
{
104113
$routes = $this->loader->load(InvokableMethodController::class);

Tests/RouteCollectionTest.php

+2
Original file line numberDiff line numberDiff line change
@@ -225,11 +225,13 @@ public function testRemove()
225225
$collection1->add('bar', $bar = new Route('/bar'));
226226
$collection->addCollection($collection1);
227227
$collection->add('last', $last = new Route('/last'));
228+
$collection->addAlias('ccc_my_custom_alias', 'foo');
228229

229230
$collection->remove('foo');
230231
$this->assertSame(['bar' => $bar, 'last' => $last], $collection->all(), '->remove() can remove a single route');
231232
$collection->remove(['bar', 'last']);
232233
$this->assertSame([], $collection->all(), '->remove() accepts an array and can remove multiple routes at once');
234+
$this->assertNull($collection->getAlias('ccc_my_custom_alias'));
233235
}
234236

235237
public function testSetHost()

0 commit comments

Comments
 (0)