Skip to content

Commit 7e4f699

Browse files
committed
[Routing] Fix inline default null
1 parent 77bcded commit 7e4f699

File tree

2 files changed

+42
-31
lines changed

2 files changed

+42
-31
lines changed

src/Symfony/Component/Routing/Route.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ private function extractInlineDefaultsAndRequirements(string $pattern): string
420420

421421
$pattern = preg_replace_callback('#\{(!?)([\w\x80-\xFF]++)(:([\w\x80-\xFF]++)(\.[\w\x80-\xFF]++)?)?(<.*?>)?(\?[^\}]*+)?\}#', function ($m) use (&$mapping) {
422422
if (isset($m[7][0])) {
423-
$this->setDefault($m[2], '?' !== $m[6] ? substr($m[7], 1) : null);
423+
$this->setDefault($m[2], '?' !== $m[7] ? substr($m[7], 1) : null);
424424
}
425425
if (isset($m[6][0])) {
426426
$this->setRequirement($m[2], substr($m[6], 1, -1));

src/Symfony/Component/Routing/Tests/RouteTest.php

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -226,37 +226,48 @@ public function testSerialize()
226226
$this->assertNotSame($route, $unserialized);
227227
}
228228

229-
public function testInlineDefaultAndRequirement()
229+
/**
230+
* @dataProvider provideInlineDefaultAndRequirementCases
231+
*/
232+
public function testInlineDefaultAndRequirement(Route $route, string $expectedPath, string $expectedHost, array $expectedDefaults, array $expectedRequirements)
233+
{
234+
self::assertSame($expectedPath, $route->getPath());
235+
self::assertSame($expectedHost, $route->getHost());
236+
self::assertSame($expectedDefaults, $route->getDefaults());
237+
self::assertSame($expectedRequirements, $route->getRequirements());
238+
}
239+
240+
public static function provideInlineDefaultAndRequirementCases(): iterable
230241
{
231-
$this->assertEquals((new Route('/foo/{bar}'))->setDefault('bar', null), new Route('/foo/{bar?}'));
232-
$this->assertEquals((new Route('/foo/{bar}'))->setDefault('bar', 'baz'), new Route('/foo/{bar?baz}'));
233-
$this->assertEquals((new Route('/foo/{bar}'))->setDefault('bar', 'baz<buz>'), new Route('/foo/{bar?baz<buz>}'));
234-
$this->assertEquals((new Route('/foo/{!bar}'))->setDefault('bar', 'baz<buz>'), new Route('/foo/{!bar?baz<buz>}'));
235-
$this->assertEquals((new Route('/foo/{bar}'))->setDefault('bar', 'baz'), new Route('/foo/{bar?}', ['bar' => 'baz']));
236-
237-
$this->assertEquals((new Route('/foo/{bar}'))->setRequirement('bar', '.*'), new Route('/foo/{bar<.*>}'));
238-
$this->assertEquals((new Route('/foo/{bar}'))->setRequirement('bar', '>'), new Route('/foo/{bar<>>}'));
239-
$this->assertEquals((new Route('/foo/{bar}'))->setRequirement('bar', '\d+'), new Route('/foo/{bar<.*>}', [], ['bar' => '\d+']));
240-
$this->assertEquals((new Route('/foo/{bar}'))->setRequirement('bar', '[a-z]{2}'), new Route('/foo/{bar<[a-z]{2}>}'));
241-
$this->assertEquals((new Route('/foo/{!bar}'))->setRequirement('bar', '\d+'), new Route('/foo/{!bar<\d+>}'));
242-
243-
$this->assertEquals((new Route('/foo/{bar}'))->setDefault('bar', null)->setRequirement('bar', '.*'), new Route('/foo/{bar<.*>?}'));
244-
$this->assertEquals((new Route('/foo/{bar}'))->setDefault('bar', '<>')->setRequirement('bar', '>'), new Route('/foo/{bar<>>?<>}'));
245-
246-
$this->assertEquals((new Route('/{foo}/{!bar}'))->setDefaults(['bar' => '<>', 'foo' => '\\'])->setRequirements(['bar' => '\\', 'foo' => '.']), new Route('/{foo<.>?\}/{!bar<\>?<>}'));
247-
248-
$this->assertEquals((new Route('/'))->setHost('{bar}')->setDefault('bar', null), (new Route('/'))->setHost('{bar?}'));
249-
$this->assertEquals((new Route('/'))->setHost('{bar}')->setDefault('bar', 'baz'), (new Route('/'))->setHost('{bar?baz}'));
250-
$this->assertEquals((new Route('/'))->setHost('{bar}')->setDefault('bar', 'baz<buz>'), (new Route('/'))->setHost('{bar?baz<buz>}'));
251-
$this->assertEquals((new Route('/'))->setHost('{bar}')->setDefault('bar', null), (new Route('/', ['bar' => 'baz']))->setHost('{bar?}'));
252-
253-
$this->assertEquals((new Route('/'))->setHost('{bar}')->setRequirement('bar', '.*'), (new Route('/'))->setHost('{bar<.*>}'));
254-
$this->assertEquals((new Route('/'))->setHost('{bar}')->setRequirement('bar', '>'), (new Route('/'))->setHost('{bar<>>}'));
255-
$this->assertEquals((new Route('/'))->setHost('{bar}')->setRequirement('bar', '.*'), (new Route('/', [], ['bar' => '\d+']))->setHost('{bar<.*>}'));
256-
$this->assertEquals((new Route('/'))->setHost('{bar}')->setRequirement('bar', '[a-z]{2}'), (new Route('/'))->setHost('{bar<[a-z]{2}>}'));
257-
258-
$this->assertEquals((new Route('/'))->setHost('{bar}')->setDefault('bar', null)->setRequirement('bar', '.*'), (new Route('/'))->setHost('{bar<.*>?}'));
259-
$this->assertEquals((new Route('/'))->setHost('{bar}')->setDefault('bar', '<>')->setRequirement('bar', '>'), (new Route('/'))->setHost('{bar<>>?<>}'));
242+
yield [new Route('/foo/{bar?}', [], [], [], ''), '/foo/{bar}', '', ['bar' => null], []];
243+
yield [new Route('/foo/{bar?baz}', [], [], [], ''), '/foo/{bar}', '', ['bar' => 'baz'], []];
244+
yield [new Route('/foo/{bar?baz<buz>}', [], [], [], ''), '/foo/{bar}', '', ['bar' => 'baz<buz>'], []];
245+
yield [new Route('/foo/{!bar?baz<buz>}', [], [], [], ''), '/foo/{!bar}', '', ['bar' => 'baz<buz>'], []];
246+
yield [new Route('/foo/{bar?}', ['bar' => 'baz'], [], [], ''), '/foo/{bar}', '', ['bar' => 'baz'], []];
247+
248+
yield [new Route('/foo/{bar<.*>}', [], [], [], ''), '/foo/{bar}', '', [], ['bar' => '.*']];
249+
yield [new Route('/foo/{bar<>>}', [], [], [], ''), '/foo/{bar}', '', [], ['bar' => '>']];
250+
yield [new Route('/foo/{bar<.*>}', [], ['bar' => '\d+'], [], ''), '/foo/{bar}', '', [], ['bar' => '\d+']];
251+
yield [new Route('/foo/{bar<[a-z]{2}>}', [], [], [], ''), '/foo/{bar}', '', [], ['bar' => '[a-z]{2}']];
252+
yield [new Route('/foo/{!bar<\d+>}', [], [], [], ''), '/foo/{!bar}', '', [], ['bar' => '\d+']];
253+
254+
yield [new Route('/foo/{bar<.*>?}', [], [], [], ''), '/foo/{bar}', '', ['bar' => null], ['bar' => '.*']];
255+
yield [new Route('/foo/{bar<>>?<>}', [], [], [], ''), '/foo/{bar}', '', ['bar' => '<>'], ['bar' => '>']];
256+
257+
yield [new Route('/{foo<.>?\}/{!bar<\>?<>}', [], [], [], ''), '/{foo}/{!bar}', '', ['foo' => '\\', 'bar' => '<>'], ['foo' => '.', 'bar' => '\\']];
258+
259+
yield [new Route('/', [], [], [], '{bar?}'), '/', '{bar}', ['bar' => null], []];
260+
yield [new Route('/', [], [], [], '{bar?baz}'), '/', '{bar}', ['bar' => 'baz'], []];
261+
yield [new Route('/', [], [], [], '{bar?baz<buz>}'), '/', '{bar}', ['bar' => 'baz<buz>'], []];
262+
yield [new Route('/', ['bar' => 'baz'], [], [], '{bar?}'), '/', '{bar}', ['bar' => null], []];
263+
264+
yield [new Route('/', [], [], [], '{bar<.*>}'), '/', '{bar}', [], ['bar' => '.*']];
265+
yield [new Route('/', [], [], [], '{bar<>>}'), '/', '{bar}', [], ['bar' => '>']];
266+
yield [new Route('/', [], ['bar' => '\d+'], [], '{bar<.*>}'), '/', '{bar}', [], ['bar' => '.*']];
267+
yield [new Route('/', [], [], [], '{bar<[a-z]{2}>}'), '/', '{bar}', [], ['bar' => '[a-z]{2}']];
268+
269+
yield [new Route('/', [], [], [], '{bar<.*>?}'), '/', '{bar}', ['bar' => null], ['bar' => '.*']];
270+
yield [new Route('/', [], [], [], '{bar<>>?<>}'), '/', '{bar}', ['bar' => '<>'], ['bar' => '>']];
260271
}
261272

262273
/**

0 commit comments

Comments
 (0)