Routing: module & subdomény
- xificurk
- Člen | 121
Zdravím,
snažím se neúspěšně sestavit router pro routování modulů na subdomény,
cílem je zhruba následující fungování:
http://example.com →
:Root:Default:default()
http://module.example.com
→ :Module:Default:default()
Předpokládal jsem, že by mělo na to fungovat něco takového (s příslušným překladovým slovníkem):
<?php
$router[] = new Route('//<module>example.com/<presenter>/<action>/', array(
'module' => 'Root',
'presenter' => 'Default',
'action' => 'default',
));
?>
Ale kvůli reguláru pro modul nedojde vůbec k rozpoznání routy pro
http://example.com
. Tak jsem tedy přidal:
<?php
Route::setStyleProperty('module', Route::FILTER_TABLE, array(
'' => 'Root',
));
Route::setStyleProperty('module', Route::PATTERN, '[a-z0-9.-]*');
?>
Teď už se routa hezky identifikuje, jenže canonicalize() se snaží
přesměrovat na http:///
. Když se odstraní výchozí hodnota pro
module z routeru, skončí canonicalize() pro změnu na: No route for
Root:Default:default().
Jak z toho ven?
EDIT: Oprava kódu: ROOTHOST → ‚example.com‘
Editoval xificurk (14. 5. 2009 2:48)
- Patrik Votoček
- Člen | 2221
Ted strelim od boku.
Co mas v konstante ROOTHOST? example.com nebo .example.com (s teckou na zacatku)?
Já bych to asi resil tak ze bych udelal 2 routy jednu pto example.com (Root:Default:default) a druhou pro <module>.example.com (<Module>:Default:default). Teoreticky by to melo fungovat. Problem vidim prave v tom ze asi misto example.com to bere .example.com pokud bych to delal jenom na jednu tak bych musel v prekladovem slovniku udavat vse s teckou na konci.
Btw mas urcite nejky data v konstante ROOTHOST?
Netestoval jsem jenom je to moje domnenka ze by to tak mohlo fungovat
Editoval vrtak-cz (14. 5. 2009 2:38)
- xificurk
- Člen | 121
vrtak-cz napsal(a):
Ted strelim od boku.
Co mas v konstante ROOTHOST? example.com nebo .example.com (s teckou na zacatku)?
Já bych to asi resil tak ze bych udelal 2 routy jednu pto example.com (Root:Default:default) a druhou pro <module>.example.com (<Module>:Default:default). Teoreticky by to melo fungovat. Problem vidim prave v tom ze asi misto example.com to bere .example.com pokud bych to delal jenom na jednu tak bych musel v prekladovem slovniku udavat vse s teckou na konci.
Btw mas urcite nejky data v konstante ROOTHOST?
Netestoval jsem jenom je to moje domnenka ze by to tak mohlo fungovat
jj, je tam example.com
(zapomněl jsem v ukázkovém kódu
nahradit) – sice můžu vytvořit routy pro různé moduly, jenže tím se
tak nějak připravuju o výhodu vytváření route.
- Patrik Votoček
- Člen | 2221
asi jsme se nepochopily. Rikal jsem co kdyz misto jedne routy budes mit 2:
<?php
$router[] = new Route('//example.com/<presenter>/<action>/', array(
'module' => 'Root',
'presenter' => 'Default',
'action' => 'default',
));
$router[] = new Route('//<module>.example.com/<presenter>/<action>/', array(
'presenter' => 'Default',
'action' => 'default',
));
?>
Takhle to funguje?
- xificurk
- Člen | 121
vrtak-cz napsal(a):
asi jsme se nepochopily. Rikal jsem co kdyz misto jedne routy budes mit 2:
<?php $router[] = new Route('//example.com/<presenter>/<action>/', array( 'module' => 'Root', 'presenter' => 'Default', 'action' => 'default', )); $router[] = new Route('//<module>.example.com/<presenter>/<action>/', array( 'presenter' => 'Default', 'action' => 'default', )); ?>
Takhle to funguje?
Tohle řešení pořád zdvojnásobuje počet route. Nakonec jsem to udělal
tak, že jako module
jsem označil celou doménu a
example.com
přesunul ke každé položce v překladové tabulce,
zdá se, že to funguje :)
- PetrP
- Člen | 587
xificurk napsal(a):
Tohle řešení pořád zdvojnásobuje počet route. Nakonec jsem to udělal tak, že jako
module
jsem označil celou doménu aexample.com
přesunul ke každé položce v překladové tabulce, zdá se, že to funguje :)
To je takové nic moc řešení. A kolik máš rout že je zdvojnásobení počtu takovej zabiják?
Jinak nešlo by to řešit pomoci foo parametru? např něco jako:
$router[] = new Route('//<module><?. \.|>example.com/<presenter>/<action>/', array(
'module' => 'Root',
'presenter' => 'Default',
'action' => 'default',
));
EDIT: při tomhle se ale bude blbě gerovat adresa bez modulu
Editoval PetrP (14. 5. 2009 18:56)
- David Grudl
- Nette Core | 8218
Na tyto situace už existuje řešení v podobě volitelných sekvencí uzavřených do složených závorek:
$router[] = new Route('//{<module>.}example.com/<presenter>/<action>/', array(
'presenter' => 'Default',
'action' => 'default',
));
Tím se vlastně říká, že parametr module
je volitelný, ale
pokud bude vynechán, tak včetně svého okolí určeného závorkami.
- David Grudl
- Nette Core | 8218
Ještě dodám, že tato technika jde použít i zanořeně, např.:
$route = new Route('{<lang [a-z]{2}>{-<sub>}/}<name>{/page-<page>}', array(
'sub' => 'cz',
'page' => 0,
));
bude akceptovat adresy:
/cs/stranka
/cs-cz/stranka
/stranka
/stranka/page-12
atd.
- Patrik Votoček
- Člen | 2221
David Grudl napsal(a):
Ještě dodám, že tato technika jde použít i zanořeně, např.:
$route = new Route('{<lang [a-z]{2}>{-<sub>}/}<name>{/page-<page>}', array( 'sub' => 'cz', 'page' => 0, )); bude akceptovat adresy: /cs/stranka /cs-cz/stranka /stranka /stranka/page-12 atd.
neměl by v tomhle případě mít i parametr lang nastavenou výchozí hodnotu?
- Honza Marek
- Člen | 1664
Velmi zajímavé. To je novinka nebo se s tim jen Nette Foundation dlouhá léta nepochlubila?
- ViliamKopecky
- Nette hipster | 230
ad Honza M. – taky by mě zajímalo… a taky by mě ještě zajímalo kolik takových skrytých vychytávek tam ještě je :)
- Tomik
- Nette Evangelist | 485
David Grudl napsal(a):
Ještě dodám, že tato technika jde použít i zanořeně, např.:
$route = new Route('{<lang [a-z]{2}>{-<sub>}/}<name>{/page-<page>}', array( 'sub' => 'cz', 'page' => 0, )); bude akceptovat adresy: /cs/stranka /cs-cz/stranka /stranka /stranka/page-12 atd.
Heh. Díky za informaci. Hned budu mít v aplikaci dvakrát tak míň Rout. :)
- stpnkcrk
- Generous Backer | 190
Honza M. napsal(a):
Velmi zajímavé. To je novinka nebo se s tim jen Nette Foundation dlouhá léta nepochlubila?
Když se podíváš do Commit History, tak tuhle novinku David commitnul včera – čili je to novinka.