2015-01-07 12 views
6

Sto provando a configurare il sistema di routing con sottodominio che rappresenta la locale corrente. Routing viene impostata tramite @Routing annotazione e si presenta così:Instradamento di symfony - locale come sottodominio con fallback predefinito

/** 
* @Route(
*  "/", 
*  name="homepage", 
*  host="{locale}.{domain}", 
*  defaults={"locale" = "en", "domain" = "%domain%"}, 
*  requirements={"locale" = "en|de|fr", "domain" = "%domain%"} 
*) 
*/ 

funziona bene per URL come en.somedomain.com o de.somedomain.com, ma non riesce a trovare percorso corretto per somedomain.com senza locale.

Capisco che a causa del parametro host, che è impostato per rappresentare esattamente locale.domain modello, ma non riesco a trovare modo di dire sistema di routing Symfony che ci potrebbe essere ulteriore, di default host.

Cerca tutto intorno, ma non ha trovato nulla di particolare. Gradirei qualsiasi aiuto!

UPDATE

V'è in realtà un modo per farlo, con l'aggiunta di un'altra @Route in annotazione, senza host parametro:

/** 
* @Route(
*  "/", 
*  name="homepage_default", 
*  defaults={"locale" = "en"} 
*) 
*/ 

ma questo sembra un po 'sporca, e io non sono utilizzando il parametro %domain% lì, che è importante per me, ad esempio se avessi bisogno di un altro sottodominio per la versione mobile.

risposta

5

Beh, sembra che tripla di routing di annotazione per gestire locale + sottodominio è l'unica scelta per ora.

Lo studio della documentazione (ad esempio, this article) mostra che gli sviluppatori Symfony ci incoraggiano a farlo in quel modo, il che, per me, non è bello. Tuttavia, ecco la soluzione ...

/** 
* @Method({"GET"}) 
* @Route(
*  "/", 
*  name="homepage", 
*  host="{mobile}.{_locale}.{domain}", 
*  defaults={"mobile" = "moblie", "locale" = "%locale%", "domain" = "%domain%"}, 
*  requirements={"mobile" = "mobile|m", "_locale" = "%locale%|de|fr", "domain" = "%domain%"} 
*) 
* @Route(
*  "/", 
*  name="homepage", 
*  host="{_locale}.{domain}", 
*  defaults={"_locale" = "%locale%", "domain" = "%domain%"}, 
*  requirements={"_locale" = "%locale%|de|fr", "domain" = "%domain%"} 
*) 
* @Route(
*  "/", 
*  name="homepage_default", 
*  defaults={"_locale" = "%locale%"} 
*) 
*/ 

Si noti che l'ordine è importante, a partire da sottodomini, scendendo per impostazione predefinita. Dato che questo sembra brutto con @Route annotazione, ho deciso di ri-scrivere questo in YAML così:

homepage_locale_mobile: 
    path: /
    host:  "{mobile}.{_locale}.{domain}" 
    defaults: { mobile: "mobile", _locale: "%locale%", domain: "%domain%" } 
    requirements: 
     mobile: "mobile|m" 
     _locale: "%locale%|de|fr", 
     domain: "%domain%" 

homepage_locale: 
    path: /
    host:  "{_locale}.{domain}" 
    defaults: { _locale: "%locale%", domain: "%domain%" } 
    requirements: 
     _locale: "%locale%|de|fr", 
     domain: "%domain%" 

homepage: 
    path: /
    defaults: { _locale: "%locale%" } 

ordinato pure. Forse qualcuno lo incontrerà e lo userà.

0

Ho appena avuto un problema simile con i valori predefiniti, anche se era un parametro di percorso e non locale.

La soluzione era lì per sostituire i segni = con: come dovrebbe essere e il compilatore in qualche modo non si lamenta.

Quindi provare questo fuori:

/** 
* @Route(
*  "/", 
*  name="homepage", 
*  host="{locale}.{domain}", 
*  defaults={"locale" : "en", "domain" : "%domain%"}, 
*  requirements={"locale" : "en|de|fr", "domain" : "%domain%"} 
*) 
*/ 
+0

che è molto utile sapere, però, il mio problema non è con errori di compilazione; è Symfony "Impossibile trovare l'eccezione del percorso corretto" quando richiedo il dominio predefinito. E il problema è che non posso definire più parametri 'host', come:' host = {"{locale}. {Dominio}", "{dominio}"} '. Annotazioni soprattutto belle e funzionanti. – Nevertheless

+0

Ho pensato che la causa del problema è che Symfony "non può vedere" quell'impostazione locale predefinita ed è per questo che non può corrispondere ad una rotta; perché non ho avuto errori di compilatore in precedenza ma il mio parametro predefinito non funzionava. –

Problemi correlati