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