Routing: module & subdomény

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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 :)

Patrik Votoček
Člen | 2221
+
0
-

také možnost… :-) hlavně že jsi to vyřešil.

PetrP
Člen | 587
+
0
-

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 a example.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
+
0
-

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
+
0
-

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
+
0
-

super fíčura hned to jdu testnout… :-)

Patrik Votoček
Člen | 2221
+
0
-

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
+
0
-

Velmi zajímavé. To je novinka nebo se s tim jen Nette Foundation dlouhá léta nepochlubila?

ViliamKopecky
Nette hipster | 230
+
0
-

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
+
0
-

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
+
0
-

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.

David Grudl
Nette Core | 8218
+
0
-