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