2010-06-28 5 views
5

Używam Symfony 1.2.7. Moja witryna jest w kilku językach, każdy z nich należy do subdomeny, takiej jak en.example.com, es.example.com. Jeśli użytkownik wejdzie w example.com, chcę go przekierować do jego języka. Chcę również obsługiwać staging.example.com i przekierowywać do es.staging.example.com i en.staging.example.com, aby móc przetestować wszystko przed wdrożeniem.Wykryj język i przekierowanie do poddomeny w Symfony

Mam następujący kod, który działa zarówno na index.php i frontend_dev.php. Moje pytanie brzmi: czy możesz to poprawić? czy istnieje lepszy lub czystszy sposób? Dzięki!

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(); 

Aktualizacja Rozwiązanie: Filtr niestandardowy

<?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(); 
    } 
} 

Odpowiedz

1

Korzystanie z systemu routingu w Symfony jest właściwym rozwiązaniem dla tego rodzaju problemów.

Spójrz na http://www.symfony-project.org/jobeet/1_2/Doctrine/en/05 dla ogólnej informacji routingu i na http://www.symfony-project.org/blog/2009/03/02/call-the-expert-adding-subdomain-requirements-to-routing-yml dla zaawansowanych zagadnień routingu.

Uwaga: zdecydowanie sugeruję aktualizację do wersji 1.4, ponieważ 1.2 nie jest już utrzymywany. (http://www.symfony-project.org/tutorial/1_4/en/upgrade)

+0

dzięki treur. Sprawdziłem już te artykuły i nie rozwiązują one mojego problemu. Wszystkie działania są takie same na stronach es.example.com i en.example.com. I chcę przekierować główną domenę w zależności od języka. Zamierzam dokonać aktualizacji za kilka tygodni, kiedy mamy czas, aby sprawdzić, czy wszystko działa poprawnie. – fesja

+0

Hmm. Widzę. W takim przypadku myślę, że użycie filtra jest bardziej eleganckim rozwiązaniem. Ponadto, filtry można włączać/wyłączać za pomocą plików cookie, które usuwają niepotrzebne obciążenie, gdy użytkownik jest już na właściwej poddomenie: http://www.symfony-project.org/book/1_2/06-Inside-the-Controller -Layer # chapter_06_sub_building_your_own_filter – Treur

+0

To lepiej. Co jednak, jeśli bieżący użytkownik przejdzie do example.com. Mam jego plik cookie i wiem, że chce on sieci w języku angielskim; ale jeśli nie sprawdzę hosta, użyje adresu www.example.com w języku angielskim zamiast en.example.com. Szewuje, że zawsze muszę sprawdzić hosta poddomeny. Jeśli jest użytkownikiem (getCulture()), jeśli nie, sprawdź języki przeglądarki. – fesja