Sous-domaines dynamiques Symfony

j'essaie de faire correspondre les sous-domaines à l'identification d'un client à symfony.

c'est à dire que j'ai customer1.example.com et customer2.example.com

les domaines sont stockés dans une table.

quand un utilisateur va customer1.example.com, je voudrais obtenir le sous-domaine, chercher le nom de domaine dans la base de données, une fois apparié, il déploiera alors la config app pour ce client et ensuite stocker le customer_Id dans un attribut global afin que je sais exactement quel client je traite à travers l'ensemble de l'application. Le serveur virtuel aura le nom générique correspondant à servername.

Avez-vous réussi à atteindre cet objectif, et si oui, comment? Si non, n'importe quelles idées seraient une grande aide!

je pense utiliser un filtre pour le faire.

: -)

11
demandé sur Flukey 2010-06-07 16:40:49

4 réponses

vous aurez aussi besoin de définir votre domaine comme un domaine de remplacement, sinon vous devrez créer manuellement chaque sous-domaine par client.

une autre solution qui n'est pas si dépendante de symphony est d'utiliser A.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 (.*) ?sub=%2&page=&domain=%{HTTP_HOST} [QSA,L]
<IfModule>

ce code enverra essentiellement à la page demandée le sous-domaine, le domaine et la page demandée. puis dans php vous pouvez vérifier si elle est égale à votre nom d'utilisateur client. et vous permet également d'utiliser des domaines stationnés pour vos clients au même temps.

j'espère que cela aide.

4
répondu shadow_of__soul 2010-06-21 10:28:44

regardez sfDomainRoutePlugin - il fait ce que vous voulez. Cependant, dans sa version actuelle, vous n'obtenez pas les fonctionnalités Propel ou DoctrineRoute, ce qui signifie que vous devez rechercher manuellement le client en fonction du paramètre subdomain retourné par le plugin. 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.classe.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);
}

C'est juste un exemple, mais j'utilise une approche similaire moi - même, et le plugin fait ce qui est annoncé. Bonne chance.

si vous êtes aventureux, yuo pourrait jeter un oeil au chapitre 2 dans le "More with symfony book". Cela vous aiderait à comprendre le code dans sfDomainRoutePlugin.

1
répondu cvaldemar 2010-06-17 09:40:30

parce que vous voulez charger une application différente, le filtre n'aidera pas. Il suffit d'utiliser le frontcontroller (index.php) pour extraire le sous-domaine, et si le répertoire app existe, charger l'application (sinon, 404). Vous pouvez même stocker l'id de configuration de l'application.

0
répondu Marek 2010-06-08 00:15:59

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
répondu Jeremy Kauffman 2010-06-08 00:58:42