Chyba Route pro routu typu HOST na nestandardnim portu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
stanley
Člen | 22
+
0
-

Pri definovani takoveto routy

$router[] = new Route("//localhost:8888/<presenter>/<action>", array(
        'presenter' => 'Default',
        'action' => 'default',
));

dojde k vyvolani chyby „No route for HTTP request“.

Chyba je zpusobena tim, ze se do srovnavaciho retezce nevlozi cislo portu. Muze se to vyresit bud v metode Route->match()

if ($this->type === self::HOST) {
    $port = $uri->getPort();
    $port = (($port != 80) and ($port != 443)) ? ":$port" : '';
    $path = '//' . $uri->getHost() . $port . $uri->getPath();
}

nebo upravou metody Uri->getHost()

public function getHost()
{
	$port = (($this->port != 80) and ($this->port != 443)) ? ':' . 	$this->port : '';
	return $this->host . $port;
}

Mozna by to chtelo namisto porovnavani portu se standardnimi hodnotami spis detekovat ze je port soucasti adresy a v Uri si to pamatovat, v HttpRequestFactory->createHttpRequest() takto:

if (isset($pair[1])) {
	$uri->port = (int) $pair[1];
	$uri->includePort = true;
}

(a v Uri pak prislusnym zpusobem upravit metodu getHost)

Omlouvam se pokud se zde tenhle problem nekde jinde jiz resil a nebo se v necem mylim.

David Grudl
Nette Core | 8218
+
0
-

Problém je v tom, že to není zpětně kompatibilní změna, přístup z jiných portů by přestal fungovat, neboť by museli být specifikované v každé masce začínající na //. Takže bych to raději dal k diskusi, jestli implementovat nebo ne.

PetrP
Člen | 587
+
0
-

Sice trochu staré vlákno ale kdyby někdo další na něj narazil tak sem hodím jak jsem tohle si vyřešil.

Když nepotřebujete aby se podle portu lišilo jaká routa se matchne tak lze toto:

new Route('//localhost[!:8888]/<presenter>/<action>', ...)

To způsobí že při matchnutí nevadí že neobsahuje port, ale pří vytváření url to port zahrne.