2010-06-28 17 views
5

पर सबडोमेन पर रीडायरेक्ट करें मैं सिम्फनी 1.2.7 का उपयोग कर रहा हूं। मेरा वेब कई भाषाओं में है, प्रत्येक में से एक सबडोमेन में en.example.com, es.example.com है। यदि उपयोगकर्ता example.com में प्रवेश करता है, तो मैं उसे अपनी भाषा में रीडायरेक्ट करना चाहता हूं। मैं staging.example.com का समर्थन भी करना चाहता हूं और es.staging.example.com और en.staging.example.com पर रीडायरेक्ट करना चाहता हूं ताकि मैं तैनाती से पहले सब कुछ जांच सकूं।भाषा का पता लगाएं और सिम्फनी

मेरे पास निम्न कोड है जो index.php और frontend_dev.php दोनों पर काम करता है। मेरा सवाल है, क्या आप इसे सुधार सकते हैं? क्या कोई बेहतर या क्लीनर तरीका है? धन्यवाद!

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

अद्यतन समाधान: कस्टम फ़िल्टर

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

उत्तर

1

Symfony के मार्ग प्रणाली का उपयोग मुद्दों के इन प्रकार के लिए उचित समाधान है।

सामान्य रूटिंग जानकारी के लिए और उन्नत मार्ग मुद्दों के लिए http://www.symfony-project.org/blog/2009/03/02/call-the-expert-adding-subdomain-requirements-to-routing-yml पर http://www.symfony-project.org/jobeet/1_2/Doctrine/en/05 पर एक नजर डालें।

नोट: मैं दृढ़ता से एसएफ 1.4 को अपडेट करने का सुझाव देता हूं क्योंकि 1.2 अब और नहीं बनाए रखा गया है। (http://www.symfony-project.org/tutorial/1_4/en/upgrade)

+0

धन्यवाद treur। मैंने पहले से ही उन लेखों की जांच की है और वे मेरी समस्या का समाधान नहीं करते हैं। सभी क्रियाएं es.example.com और en.example.com पर समान हैं। और मैं भाषा के आधार पर मुख्य डोमेन को रीडायरेक्ट करना चाहता हूं। मैं कुछ हफ्तों में अपग्रेड करने जा रहा हूं, जब हमारे पास सब कुछ सही काम करने के लिए समय है। – fesja

+0

हम्म। समझा। उस मामले में मुझे लगता है कि फ़िल्टर का उपयोग करना एक और अधिक सुरुचिपूर्ण समाधान है। इसके अलावा, फ़िल्टर कुकीज़ के साथ सक्षम/अक्षम किए जा सकते हैं जो अनावश्यक ओवरहेड को हटा देगा जब कोई उपयोगकर्ता पहले से ही उप डोमेन पर है: http://www.symfony-project.org/book/1_2/06- अंदर- the- नियंत्रक -लेयर # Chapter_06_sub_building_your_own_filter – Treur

+0

यह बेहतर है। हालांकि, अगर वर्तमान उपयोगकर्ता example.com पर जाता है तो क्या होगा। मेरे पास उसकी कुकी है, और मुझे पता है कि वह वेब में वेब चाहता है; लेकिन अगर मैं मेजबान की जांच नहीं करता, तो वह en.example.com की बजाय अंग्रेजी में www.example.com का उपयोग करेगा। यह seams है कि मुझे हमेशा सबडोमेन के लिए मेजबान की जांच करनी है। यदि वह एक उपयोगकर्ता है (getCulture()), यदि नहीं, तो ब्राउज़र भाषाएं जांचें। – fesja

संबंधित मुद्दे