Skip to content

Commit 6f03449

Browse files
committed
LinkGenerator: allow semicolon destination prefix
1 parent e6b3ed4 commit 6f03449

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/Application/LinkGenerator.php

+7
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@ public function link(string $dest, array $params = []): string
5050
}
5151
[, $presenter, $action, $frag] = $m;
5252

53+
if ($presenter[0] === ':') { // absolute
54+
$presenter = substr($presenter, 1);
55+
if (!$presenter) {
56+
throw new UI\InvalidLinkException("Missing presenter name in '$dest'.");
57+
}
58+
}
59+
5360
try {
5461
$class = $this->presenterFactory ? $this->presenterFactory->getPresenterClass($presenter) : null;
5562
} catch (InvalidPresenterException $e) {

tests/Routers/LinkGenerator.phpt

+20
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,13 @@ namespace {
5252
test(function () use ($pf) {
5353
$generator = new LinkGenerator(new Routers\SimpleRouter, new Http\UrlScript('http://nette.org/en/'), $pf);
5454
Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link('Homepage:default'));
55+
Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link(':Homepage:default'));
5556
Assert::same('http://nette.org/en/?action=default&presenter=Module%3AMy', $generator->link('Module:My:default'));
57+
Assert::same('http://nette.org/en/?action=default&presenter=Module%3AMy', $generator->link(':Module:My:default'));
5658
Assert::same('http://nette.org/en/?presenter=Module%3AMy', $generator->link('Module:My:'));
59+
Assert::same('http://nette.org/en/?presenter=Module%3AMy', $generator->link(':Module:My:'));
5760
Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link('Homepage:'));
61+
Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link(':Homepage:'));
5862
Assert::same('http://nette.org/en/?a=10&action=default&presenter=Homepage', $generator->link('Homepage:', [10]));
5963
Assert::same('http://nette.org/en/?id=20&b=10&action=detail&presenter=Homepage', $generator->link('Homepage:detail', [10, 'id' => 20]));
6064
Assert::same('http://nette.org/en/?action=default&presenter=Homepage#frag:ment', $generator->link('Homepage:#frag:ment'));
@@ -68,6 +72,18 @@ namespace {
6872
}, Nette\Application\UI\InvalidLinkException::class, "Invalid link destination 'default'.");
6973

7074

75+
Assert::exception(function () use ($pf) {
76+
$generator = new LinkGenerator(new Routers\Route('/', 'Homepage:'), new Http\UrlScript('http://nette.org/en/'), $pf);
77+
$generator->link(':');
78+
}, Nette\Application\UI\InvalidLinkException::class, 'Invalid link destination \':\'.');
79+
80+
81+
Assert::exception(function () use ($pf) {
82+
$generator = new LinkGenerator(new Routers\Route('/', 'Homepage:'), new Http\UrlScript('http://nette.org/en/'), $pf);
83+
$generator->link('::');
84+
}, Nette\Application\UI\InvalidLinkException::class, 'Missing presenter name in \'::\'.');
85+
86+
7187
Assert::exception(function () use ($pf) {
7288
$generator = new LinkGenerator(new Routers\Route('/', 'Product:'), new Http\UrlScript('http://nette.org/en/'), $pf);
7389
$generator->link('Homepage:default', ['id' => 10]);
@@ -83,9 +99,13 @@ namespace {
8399
test(function () {
84100
$generator = new LinkGenerator(new Routers\SimpleRouter, new Http\UrlScript('http://nette.org/en/'));
85101
Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link('Homepage:default'));
102+
Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link(':Homepage:default'));
86103
Assert::same('http://nette.org/en/?action=default&presenter=Module%3AMy', $generator->link('Module:My:default'));
104+
Assert::same('http://nette.org/en/?action=default&presenter=Module%3AMy', $generator->link(':Module:My:default'));
87105
Assert::same('http://nette.org/en/?presenter=Module%3AMy', $generator->link('Module:My:'));
106+
Assert::same('http://nette.org/en/?presenter=Module%3AMy', $generator->link(':Module:My:'));
88107
Assert::same('http://nette.org/en/?presenter=Homepage', $generator->link('Homepage:'));
108+
Assert::same('http://nette.org/en/?presenter=Homepage', $generator->link(':Homepage:'));
89109
Assert::same('http://nette.org/en/?0=10&presenter=Homepage', $generator->link('Homepage:', [10]));
90110
Assert::same('http://nette.org/en/?0=10&id=20&action=detail&presenter=Homepage', $generator->link('Homepage:detail', [10, 'id' => 20]));
91111
Assert::same('http://nette.org/en/?presenter=Homepage#frag:ment', $generator->link('Homepage:#frag:ment'));

0 commit comments

Comments
 (0)