2010-06-07 15 views
11

मैं सिम्फनी में किसी ग्राहक आईडी में सबडोमेन से मिलान करने का प्रयास कर रहा हूं।सिम्फनी गतिशील सबडोमेन

अर्थात मैं customer1.example.com और customer2.example.com है

डोमेन किसी तालिका में जमा हो जाती है।

जब कोई उपयोगकर्ता ग्राहक 1.example.com पर जाता है, तो मैं सबडोमेन प्राप्त करना चाहता हूं, डेटाबेस में डोमेन नाम को एक बार मिलान करना चाहता हूं, फिर उस ग्राहक के लिए ऐप कॉन्फ़िगरेशन को तैनात कर देगा और फिर ग्राहक_आईडी स्टोर करेगा एक वैश्विक विशेषता में, इसलिए मुझे पता है कि मैं कौन सा ग्राहक पूरे आवेदन के साथ निपट रहा हूं। वर्चुअल होस्ट में प्रासंगिक वाइल्डकार्ड servername होगा।

क्या आपने इसे हासिल करने में कामयाब रहा है, और यदि हां, तो कैसे? यदि नहीं, तो कोई विचार बहुत मददगार होगा!

मैं इसे करने के लिए फ़िल्टर का उपयोग करने के बारे में सोच रहा हूं।

:-)

+1

+1 अच्छा प्रश्न :-) – richsage

+0

धन्यवाद! उम्मीद है कि कोई जवाब जानता है! :-) – Flukey

उत्तर

3

आपको अपने डोमेन को वाइल्डकार्ड डोमेन के रूप में सेट करने की आवश्यकता होगी, यदि आपको प्रति क्लाइंट मैन्युअल रूप से प्रत्येक सबडोमेन बनाने की आवश्यकता नहीं है।

एक और समाधान है कि इतनी सिम्फनी निर्भर नहीं है एक .htaccess

<IfModule mod_rewrite.c> 
    Options +FollowSymLinks 
    Options +Indexes 
    RewriteEngine On 
    RewriteBase/
    RewriteCond %{HTTP_HOST} !www.domain.com$ [NC] 
    RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).domain.com [NC] 
    RewriteRule (.*) $1?sub=%2&page=$1&domain=%{HTTP_HOST} [QSA,L] 
<IfModule> 

कि कोड का उपयोग कर रहा है मूल रूप से अनुरोध किया गया पृष्ठ के लिए उप डोमेन, डोमेन और पृष्ठ का अनुरोध भेज देंगे। फिर PHP में आप जांच सकते हैं कि यह आपके क्लाइंट उपयोगकर्ता नाम के बराबर है या नहीं। और आपको एक ही समय में अपने ग्राहकों के लिए पार्क किए गए डोमेन का उपयोग करने की अनुमति देता है।

मुझे उम्मीद है कि यह मदद करता है।

0

क्योंकि आप अलग-अलग ऐप्लिकेशन लोड करना चाहते हैं, फिल्टर मदद नहीं करेगा। सबडोमेन निकालने के लिए बस फ्रंटकंट्रोलर (index.php) का उपयोग करें, और यदि ऐप निर्देशिका मौजूद है, तो ऐप लोड करें (अन्य 404)। आप ऐप कॉन्फ़िगरेशन में आईडी भी स्टोर कर सकते हैं।

+0

अरे मरेक। मैं एक अलग ऐप तैनात नहीं कर रहा हूं, मैं सिर्फ सूडोमेन को पैरामीटर वैरिएबल के रूप में उपयोग करना चाहता हूं। उदाहरण के लिए: इसके बजाय http://example.com/company1/admin होने के, मैं हर ग्राहक के लिए http://company1.example.com/admin ही एप्लिकेशन करना चाहते हैं, लेकिन मैं उप-डोमेन का उपयोग कर रहा कंपनियों को प्रासंगिक डेटा प्राप्त करने के लिए। मैं कल रात सफल होने में कामयाब रहा। मैंने एक फ़िल्टर बनाया (domainMatchFilter.class.php)। – Flukey

+0

मैंने सबडोमेन को पकड़ लिया, डोमेन से मेल खाने के लिए ग्राहक तालिका पर एक खोज की (तालिका में डोमेन फ़ील्ड पर एक इंडेक्स है)। एक बार यह पाया गया कि यह परिणाम सेट से ग्राहक ऑब्जेक्ट के साथ कॉन्फ़िगर चर चर सेट करता है। यानी sfConfig :: सेट ("ग्राहक", $ ग्राहक)। यदि कोई ग्राहक नहीं मिला है तो यह मुखपृष्ठ (example.com) पर रीडायरेक्ट करता है। क्या आपको लगता है कि एक पृष्ठ पर रीडायरेक्ट करना बेहतर होगा जो कहता है कि यह ग्राहक मौजूद नहीं है आदि? यह फ़िल्टर प्रत्येक पृष्ठ अनुरोध पर चलाया जाता है जो थोड़ा धीमा है क्योंकि यह हर बार डेटाबेस से पूछताछ करता है, हालांकि, यह एकमात्र तरीका है जिसे मैं जानता हूं कि यह कैसे करें। – Flukey

+0

मैं इसे uservoice.com की तरह काम करना चाहता हूं। आप साइन अप करते हैं, और आपको अपना खुद का डोमेन मिलता है, यानी company1.uservoice.com इत्यादि जो uservoice.com/company1 – Flukey

0

मैं कुछ ऐसा कर रहा हूं। नोट, मैंने इस सटीक सेटअप की कोशिश नहीं की है।

$tokens = explode('.', $_SERVER['SERVER_NAME'], 2); 
$app = $tokens[0] == 'www' ? 'default' : $tokens[0]; //assumes you aren't allowing www.app.example.com, change if you are 

try 
{ 
    $appConfiguration = ProjectConfiguration::getApplicationConfiguration($app, 'prod', false); 
} 
catch(InvalidArgumentException $e) //thrown if app doesn't exist 
{ 
    $fallbackConfiguration = ProjectConfiguration::getApplicationConfiguration('default', 'prod', false); 
    $context = sfContext::createInstance($fallbackConfiguration); 
    $request = $context->getRequest(); 
    $request->setParameter('module', 'default'); //set what route you want an invalid app to go to here 
    $request->setParameter('action', 'invalidApplication'); 
    $context->dispatch(); 
} 
if (isset($appConfiguration)) 
{ 
    sfContext::createInstance($appConfiguration)->dispatch(); 
} 
0

sfDomainRoutePlugin पर एक नज़र डालें - यह वही है जो आप चाहते हैं। हालांकि, इसके वर्तमान संस्करण में आपको प्रोपेल या डॉक्टरेट रूट कार्यक्षमता नहीं मिलती है, जिसका अर्थ है कि आपको प्लगइन से लौटाए गए सबडोमेन पैरामीटर के आधार पर ग्राहक को मैन्युअल रूप से देखना चाहिए। उदाहरण:

एप्लिकेशन/दृश्यपटल/config/routing.yml

# pick up the homepage 
homepage: 
    url:  /
    class:  sfDomainRoute 
    param:  { module: homepage, action: index } 
    requirements: 
    sf_host: [www.example.com, example.com] 

# catch subdomains for customers 
customer_subdomain: 
    url:  /
    class:  sfDomainRoute 
    param:  { module: customer, action: index } 

एप्लिकेशन/दृश्यपटल/मॉड्यूल/ग्राहक/actions.class.php

public function executeIndex(sfWebRequest $request) 
{ 
    // get the subdomain parameter 
    $this->subdomain = $request->getParameter('subdomain'); 
    // retrieve customer (you have to create the retrieveBySubdomain method) 
    $this->customer = CustomerPeer::retrieveBySubdomain($this->subdomain); 
} 

यह एक उदाहरण मात्र है, लेकिन मैं खुद को एक समान दृष्टिकोण का उपयोग करें, और प्लगइन विज्ञापन करता है जो विज्ञापन करता है। सौभाग्य।

यदि आप साहसी हैं, तो आप "अधिक से सिम्फनी पुस्तक" में अध्याय 2 पर एक नज़र डाल सकते हैं। इससे आपको sfDomainRoutePlugin में कोड को समझने में मदद मिलेगी।

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