Lomítko navíc v argumentu
- theo
- Člen | 57
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
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
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í.
- theo
- Člen | 57
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
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
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).