2010-06-28 7 views
5

Ich benutze Symfony 1.2.7. Mein Web befindet sich in mehreren Sprachen, jede in einer Subdomain wie en.example.com, es.example.com. Wenn der Benutzer auf example.com zugreift, möchte ich ihn auf seine Sprache umleiten. Ich möchte auch staging.example.com unterstützen und auf es.staging.example.com und en.staging.example.com umleiten, damit ich alles vor der Bereitstellung testen kann.Sprache erkennen und auf Subdomain auf Symfony umleiten

Ich habe den folgenden Code, der sowohl für index.php als auch für frontend_dev.php funktioniert. Meine Frage ist, können Sie es verbessern? Gibt es einen besseren oder saubereren Weg? Vielen Dank!

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

aktualisieren Lösung: Benutzerdefinierte Filter

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

Antwort

1

Symfony der Routing-System ist die richtige Lösung für diese Art von Fragen.

Werfen Sie einen Blick auf http://www.symfony-project.org/jobeet/1_2/Doctrine/en/05 für allgemeine Routing-Informationen und bei http://www.symfony-project.org/blog/2009/03/02/call-the-expert-adding-subdomain-requirements-to-routing-yml für erweiterte Routing-Probleme.

Hinweis: Ich empfehle dringend eine Aktualisierung auf SF 1.4, da 1.2 nicht mehr gepflegt wird. (http://www.symfony-project.org/tutorial/1_4/en/upgrade)

+0

danke treur. Ich habe diese Artikel bereits überprüft und sie lösen mein Problem nicht. Alle Aktionen sind auf es.example.com und en.example.com identisch. Und ich möchte die Hauptdomain abhängig von der Sprache umleiten. Ich werde in ein paar Wochen upgraden, wenn wir Zeit haben, zu überprüfen, ob alles richtig funktioniert. – fesja

+0

Hmm. Aha. In diesem Fall ist die Verwendung eines Filters eine elegantere Lösung. Darüber hinaus können Filter mit Cookies aktiviert/deaktiviert werden, wodurch unnötiger Overhead vermieden wird, wenn sich ein Benutzer bereits in der richtigen Subdomäne befindet: http://www.symfony-project.org/book/1_2/06-Inside-the-Controller -Layer # chapter_06_sub_building_your_own_filter – Treur

+0

das ist besser. Was passiert jedoch, wenn der aktuelle Benutzer zu example.com wechselt? Ich habe seinen Keks, und ich weiß, er will das Internet auf Englisch; Aber wenn ich den Host nicht überprüfe, wird er www.example.com in Englisch anstelle von en.example.com verwenden. Es scheint, dass ich immer den Host für die Subdomain überprüfen muss. Wenn er ein Benutzer ist (getCulture()), falls nicht, überprüfen Sie die Browsersprachen. – fesja

Verwandte Themen