2010-06-07 5 views
11

J'essaie de faire correspondre des sous-domaines à un identifiant de client dans symfony.Sous-domaines dynamiques Symfony

-à-dire i ai customer1.example.com et customer2.example.com

domaines sont stockés dans une table. Lorsqu'un utilisateur se rend sur customer1.example.com, je souhaite obtenir le sous-domaine, rechercher le nom de domaine dans la base de données, une fois qu'il est mis en correspondance, il déploie ensuite la configuration de l'application pour ce client, puis stocke le customer_Id dans un attribut global, donc je sais exactement quel client je traite avec toute la demande. L'hôte virtuel aura le nom de serveur générique approprié.

Avez-vous réussi à y parvenir, et si oui, comment? Sinon, des idées seraient d'une grande aide!

Je pense utiliser un filtre pour le faire.

:-)

+1

+1 bonne question :-) – richsage

+0

Merci! J'espère que quelqu'un connaît la réponse! :-) – Flukey

Répondre

3

Vous aurez également besoin de configurer votre domaine en tant que domaine générique, sinon vous devrez créer manuellement chaque sous-domaine par client.

une autre solution qui est pas si dépendante symphonie utilise un .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> 

ce code sera essentiellement envoyer à la page demandée le sous-domaine, le domaine et la page demandée. alors en PHP, vous pouvez vérifier si elle est égale à votre nom d'utilisateur client. et vous permet également d'utiliser des domaines parqués pour vos clients en même temps.

J'espère que cela aide.

0

Parce que vous voulez charger autre application, le filtre ne sera pas utile. Utilisez simplement le frontcontroller (index.php) pour extraire le sous-domaine, et si le répertoire de l'application existe, chargez l'application (sinon 404). Vous pouvez même stocker l'ID dans la configuration de l'application.

+0

Salut Marek. Je ne déploie pas une application différente, je veux juste utiliser le sudomain comme variable de paramètre.Par exemple: Au lieu d'avoir http://example.com/company1/admin, je souhaite avoir http://company1.example.com/admin Même application pour chaque client, mais j'utilise le sous-domaine pour obtenir les données pertinentes des entreprises. J'ai réussi à réussir hier soir. J'ai créé un filtre (domainMatchFilter.class.php). – Flukey

+0

J'ai attrapé le sous-domaine, fait une recherche sur la table client pour faire correspondre le domaine (domaine de domaine dans la table a un index dessus). Une fois trouvé, il définit une variable de configuration avec l'objet client de l'ensemble de résultats. c'est-à-dire sfConfig :: set ("client", $ client). Si aucun client n'est trouvé, il redirige vers la page d'accueil (exemple.com). Pensez-vous qu'il serait préférable de rediriger vers une page qui dit que ce client n'existe pas, etc.? Ce filtre est exécuté sur chaque requête de page, ce qui est un peu lent car il interroge la base de données à chaque fois, mais c'est la seule façon de le faire. – Flukey

+0

Je veux que cela fonctionne comme uservoice.com. Vous vous inscrivez, et vous obtenez votre propre domaine, c'est-à-dire company1.uservoice.com etc., ce qui est beaucoup plus agréable que uservoice.com/company1 – Flukey

0

Je fais quelque chose de similaire. Remarque, je n'ai pas essayé cette configuration exacte.

$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

Jetez un oeil à sfDomainRoutePlugin - il fait ce que vous voulez. Cependant, dans sa version actuelle, vous ne disposez pas de la fonctionnalité Propel ou DoctrineRoute, ce qui signifie que vous devez rechercher manuellement le client en fonction du paramètre de sous-domaine renvoyé par le plug-in. Exemple:

app/frontend/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 } 

app/frontend/modules/client/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); 
} 

Ceci est juste un exemple, mais je utiliser moi-même une approche similaire, et le plugin fait ce qui est annoncé. Bonne chance.

Si vous êtes aventureux, vous pourriez jeter un oeil au chapitre 2 dans le "Plus avec le livre symfony". Cela vous aidera à comprendre le code dans sfDomainRoutePlugin.