Lomítko navíc v argumentu

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

Mám routu vypadající takto:

<?php
...
// zobrazeni /cesty (vse se preda do id)
Route::$styles['id'] = array(
	Route::PATTERN => '.*?'
);
$router[] = new Route('/<lang>/<id .*>', array(
	'presenter' => 'Page',
	'action' => 'page',
	'id' => ''
));
?>

I když mám v URL adrese adresu končící bez lomítka tedy například /cs/registrace tak v $id stejně dostanu adresu /cs/registrace/ což mi trochu vadí (musím kvůli tomu pak dělat nějaké další tanečky se zjišťováním jestli je url soubor nebo adresář. Původně jsem si myslel, že je to otázkou kanonizace, takže jsem ji v prezenteru Page vypnul (i z jiných důvodů), ale to nepomohlo.

Může mi někdo vysvětlit proč mi router (nebo co vlastně?) přidává na konec cest (které jsou koneckonců argumentem!) lomítko? Vývoj dělám na lighttpd, kde by potenciálně taky mohl být zakopaný pes, ale myslím, že po všech experimentech s nastavením lighttpd, které jsem udělal, můžu tuhle variantu víceméně vyloučit.

Editoval theo (18. 12. 2009 13:51)

Ondřej Mirtes
Člen | 1536
+
0
-

Proč tam děláš čachry s tím patternem?

A ukaž definici všech rout, je možný, že ti to matchuje nějaká jiná.

theo
Člen | 57
+
0
-

Ondřej Mirtes napsal(a):

Proč tam děláš čachry s tím patternem?

Protože potřebuju aby mi to matchovalo i lomitka. Proč ale konkretně to se mě neptej, bo to sem opsal z jiného projektu, pro který jsem si našel řešení někde tady ve fóru :)

A ukaž definici všech rout, je možný, že ti to matchuje nějaká jiná.

Tomu nevěřím (aspon Debugger se tváří, že ne), ale nic mi to neudělá…

<?php

Route::addStyle('lang', NULL);
Route::setStyleProperty('lang', Route::PATTERN, '[a-z]{1,2}');

$router = $application->getRouter();

$router[] = new Route('index.php', array(
	'presenter' => 'Page',
	'action' => 'negotiate'
), Route::ONE_WAY);

$router[] = new Route('/', array(
	'presenter' => 'Page',
	'action' => 'negotiate'
));

$router[] = new Route('/lastversion.php?MAIL=<mail .*?>&VERSION=<version .*?>', array(
	'presenter' => 'Page',
	'action' => 'lastVersion'
));

$router[] = new Route('/lastversion.html?MAIL=<mail .*>&VERSION=<version .*?>', array(
	'presenter' => 'Page',
	'action' => 'lastVersion'
));

$router[] = new Route('/<lang>/registrace', array(
	'presenter' => 'User',
	'action' => 'register'
));

$router[] = new Route('/<lang>/registration', array(
	'presenter' => 'User',
	'action' => 'register'
));

$router[] = new Route('/<lang>/prihlaseni', array(
	'presenter' => 'User',
	'action' => 'login'
));

$router[] = new Route('/<lang>/login', array(
	'presenter' => 'User',
	'action' => 'login'
));

$router[] = new Route('/<lang>/odhlaseni', array(
	'presenter' => 'User',
	'action' => 'logout'
));

$router[] = new Route('/<lang>/logout', array(
	'presenter' => 'User',
	'action' => 'logout'
));

Route::$styles['id'] = array(
	Route::PATTERN => '.*?'
);
$router[] = new Route('/<lang>/<id .*>', array(
	'presenter' => 'Page',
	'action' => 'page',
	'id' => ''
));
?>

Jsem si vědom, toho že by se to asi dalo zjednodušit, ale to mě teď zrovna úplně netrápí.

Michalek
Člen | 211
+
0
-

Kontrolní otázka: Nedělá ti to .htaccess?

theo
Člen | 57
+
0
-

Michalek napsal(a):

Kontrolní otázka: Nedělá ti to .htaccess?

Ahm, dobře pro ty, kdož neznají lighttpd: lighttpd nemá nic jako .htaccess (a to dokonce ani jako modul). Samozřejmě to bylo první co jsem podezříval, ale není tomu tak. Když se v presenteru podivám do $_GET['id'] tak tam je cesta bez lomítka, takže zcela bezpečně se to objevuje někde během zpracování v Nette.

Editoval theo (18. 12. 2009 20:14)

David Grudl
Nette Core | 8228
+
0
-

Tohle způsobuje zápis

$router[] = new Route('/<lang>/<id .*>', array(

Proč to tak je. Na internetu se předpokládá, že adresy

https://forum.nette.org/neco/neco/necojineho
https://forum.nette.org/neco/neco/necojineho/

povedou na stejný zdroj. Při použití cool uri je na to ale potřeba pamatovat a explicitně to ošetřovat. Samozřejmě Nette Framework podobné situace vždy raději řeší sám. I v tomto případě adresu normalizuje na jednu společnou – a z technických důvodů je to ta druhá. Proto se v ID objeví lomítko.

Samozřejmě dalo by se teď řešit, jestli by nebylo lepší normalizovat na adresu bez lomítka (asi ano, ale co zpětná kompatibilita?), každopádně lomítko lze vynechat přidáním otazníku:

$router[] = new Route('/<lang>/<id .*?>', array(
theo
Člen | 57
+
0
-

David Grudl napsal(a):

Proč to tak je. Na internetu se předpokládá, že adresy

https://forum.nette.org/neco/neco/necojineho
https://forum.nette.org/neco/neco/necojineho/

povedou na stejný zdroj. Při použití cool uri je na to ale potřeba pamatovat a explicitně to ošetřovat. Samozřejmě Nette Framework podobné situace vždy raději řeší sám. I v tomto případě adresu normalizuje na jednu společnou – a z technických důvodů je to ta druhá. Proto se v ID objeví lomítko.

Rozumím tomu a souhlasím s řešením. Jen jsem nikde nebyl schopen zjistit co s tím.

Samozřejmě dalo by se teď řešit, jestli by nebylo lepší normalizovat na adresu bez lomítka (asi ano, ale co zpětná kompatibilita?), každopádně lomítko lze vynechat přidáním otazníku:

$router[] = new Route('/<lang>/<id .*?>', array(

Perfektní, funguje to přesně jak píšeš. Mohl by se popis téhle fičury objevit v dokumentaci? Hledal jsem to tam a zpětně jsem to našel zde, ale jen jako zmínku v trochu jiném kontextu (pro cesty na souborovém systému).