2010-06-28 15 views
5

Estoy usando Symfony 1.2.7. Mi sitio web está en varios idiomas, cada uno de ellos está en un subdominio como en.example.com, es.example.com. Si el usuario entra en example.com, quiero redirigirlo a su idioma. También quiero tener soporte de staging.example.com y redirigir a es.staging.example.com y en.staging.example.com para que pueda probar todo antes de la implementación.Detecta lenguaje y redirige a un subdominio en Symfony

Tengo el siguiente código que funciona tanto en index.php como en frontend_dev.php. Mi pregunta es, ¿puedes mejorarla? ¿hay una manera mejor o más limpia? ¡Gracias!

require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php'); 

$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'dev', true); 
$context = sfContext::createInstance($configuration); 

// get the domain parts as an array 
$host = array_reverse(explode('.', $_SERVER['HTTP_HOST'])); 
list($tld, $domain, $subdomain) = $host; 

// determine which subdomain we're looking at 
$app = ($subdomain == 'staging') ? $subdomain2=$host[3] : $subdomain; 

if(empty($app) || $app == 'www') 
{ 
    $browser_languages = $context->getRequest()->getLanguages(); 

    foreach($browser_languages as $language) 
    { 
    $allowed_culture = in_array($language, sfConfig::get('app_languagesAvailable')); 
    if($allowed_culture) 
    { 
     $domain = $subdomain ? $subdomain.'.'.$domain : $domain; 
     $url = 'http://'.str_replace($domain.'.'.$tld, $language.'.'.$domain.'.'.$tld, $_SERVER['HTTP_HOST']).$_SERVER['REQUEST_URI']; 

     $context->getController()->redirect($url); 
     break; 
    } 
    } 
} 

$context->dispatch(); 

actualización Solución: Filtro personalizado

<?php 

class subdomainFilter extends sfFilter 
{ 
    public function execute($filterChain) 
    { 
     $context = $this->getContext(); 
     $user = $this->getContext()->getUser(); 
     $request = $this->getContext()->getRequest(); 

     // get the domain parts as an array 
     $host = array_reverse(explode('.', $request->getHost())); 
     list($tld, $domain) = $host; 
     $subdomain2 = $host[3]; 
     $subdomain = $host[2]; 

     // determine which subdomain we're looking at 
     $app = ($host[2] == 'staging') ? $subdomain2 : $subdomain; 

     if(empty($app) || $app == 'www') 
     { 
      // if first time 
      if ($this->isFirstCall()) 
      { 
      $browser_languages = $request->getLanguages(); 
      // set default lang, for API as CURL doesn't set the language 
      $lang = sfConfig::get('app_default_culture'); 

      foreach($browser_languages as $language) 
      { 
       $allowed_culture = in_array($language, sfConfig::get('app_languagesAvailable')); 
       if($allowed_culture) 
       { 
       $lang = $language; 
       break; 
       } 
      } 
      }else { 
      // Get user culture 
      $lang = $user->getCulture(); 
      } 

      $domain = $subdomain ? $subdomain.'.'.$domain : $domain; 
      $url = str_replace($domain.'.'.$tld, $lang.'.'.$domain.'.'.$tld, $request->getURI()); 
      $context->getController()->redirect($url); 
     } 

     $filterChain->execute(); 
    } 
} 

Respuesta

1

Usando el sistema de enrutamiento de Symfony es la solución adecuada para este tipo de problemas.

Tome un vistazo a http://www.symfony-project.org/jobeet/1_2/Doctrine/en/05 para obtener información de enrutamiento general y en http://www.symfony-project.org/blog/2009/03/02/call-the-expert-adding-subdomain-requirements-to-routing-yml de problemas de enrutamiento avanzados.

Nota: Recomiendo actualizar a sf 1.4 porque 1.2 ya no se mantiene. (http://www.symfony-project.org/tutorial/1_4/en/upgrade)

+0

gracias treur. Ya revisé esos artículos y no resuelven mi problema. Todas las acciones son iguales en es.example.com y en.example.com. Y quiero redireccionar el dominio principal según el idioma. Voy a actualizar en unas pocas semanas, cuando tengamos tiempo para verificar que todo funcione bien. – fesja

+0

Hmm. Ya veo. En ese caso, creo que usar un filtro es una solución más elegante. Además, los filtros se pueden habilitar/deshabilitar con cookies, lo que eliminará la sobrecarga innecesaria cuando un usuario ya se encuentra en el subdominio correcto: http://www.symfony-project.org/book/1_2/06-Inside-the-Controller -Layer # chapter_06_sub_building_your_own_filter – Treur

+0

eso es mejor. Sin embargo, ¿qué sucede si el usuario actual va a example.com? Tengo su cookie, y sé que quiere la web en inglés; pero si no verifico el host, usará www.example.com en inglés en lugar de en.example.com. Parece que siempre tengo que verificar el host para el subdominio. Si él es un usuario (getCulture()), de lo contrario, verifique los idiomas del navegador. – fesja

Cuestiones relacionadas