2010-06-07 21 views
11

Estoy tratando de hacer coincidir los subdominios con una identificación de cliente en Symfony.Subdominios Symfony dinámicos

es decir que he customer1.example.com y customer2.example.com

Dominios se almacenan en una tabla.

Cuando un usuario va a customer1.example.com, me gustaría obtener el subdominio, buscar el nombre de dominio en la base de datos, una vez que coincida, desplegará la configuración de la aplicación para ese cliente y luego almacenará el ID_cliente en un atributo global, así sé exactamente con qué cliente estoy tratando a través de toda la aplicación. El host virtual tendrá el nombre de servidor wildcard relevante.

¿Ha logrado esto y, de ser así, cómo? Si no, ¡cualquier idea sería de gran ayuda!

Estoy pensando en utilizar un filtro para hacerlo.

:-)

+1

+1 buena pregunta :-) – richsage

+0

¡Gracias! ¡Espero que alguien sepa la respuesta! :-) – Flukey

Respuesta

3

también va a necesitar que establezca su dominio como un comodín, si no va a necesitar crear manualmente cada subdominio por cliente.

otra solución que no sea tan dependiente de la sinfonía está utilizando 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> 

ese código, básicamente, enviará a la página solicitada el subdominio, el dominio y la página solicitada. luego en php puedes verificar si es igual al nombre de usuario de tu cliente. y le permiten también usar dominios aparcados para sus clientes al mismo tiempo.

espero que ayude.

0

Debido a que desea cargar diferentes aplicaciones, el filtro no ayudará. Simplemente use el frontcontroller (index.php) para extraer el subdominio, y si el directorio de la aplicación existe, cargue la aplicación (sino 404). Incluso puede almacenar la identificación en la configuración de la aplicación.

+0

Hey Marek. No estoy implementando una aplicación diferente, solo quiero usar sudomain como una variable de parámetro. Por ejemplo: en lugar de tener http://example.com/empresa1/admin, quiero tener http://company1.example.com/admin Misma aplicación para cada cliente, pero estoy usando el subdominio para obtener las empresas de datos relevantes. Logré triunfar anoche. Creé un filtro (domainMatchFilter.class.php). – Flukey

+0

Agarré el subdominio, hice una búsqueda en la tabla de clientes para que coincida con el dominio (el campo de dominio en la tabla tiene un índice). Una vez encontrado, establece una variable de configuración con el objeto del cliente del conjunto de resultados. es decir, sfConfig :: set ("cliente", $ cliente). Si no se encuentra un cliente, lo redirige a la página de inicio (example.com). ¿Crees que sería mejor redirigir a una página que dice que este cliente no existe, etc.? Este filtro se ejecuta en cada solicitud de página, que es un poco lenta porque consulta la base de datos cada vez, sin embargo, es la única forma en que sé cómo hacerlo. – Flukey

+0

Quiero que funcione como uservoice.com. Usted se registra y obtiene su propio dominio, es decir, company1.uservoice.com etc., que es mucho más agradable que uservoice.com/company1 – Flukey

0

Estoy haciendo algo similar. Tenga en cuenta que no he probado esta configuración exacta.

$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

Eche un vistazo a sfDomainRoutePlugin - hace lo que quiere. Sin embargo, en su versión actual no obtiene la funcionalidad de Propel o DoctrineRoute, lo que significa que debe buscar manualmente al cliente en función del parámetro del subdominio devuelto desde el complemento. Ejemplo:

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/cliente/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); 
} 

Esto es sólo un ejemplo, pero utilizo un enfoque similar yo mismo, y el complemento hace lo que se anuncia. Buena suerte.

Si eres aventurero, podrías echarle un vistazo al Capítulo 2 en el "Más con el libro de Symfony". Esto lo ayudaría a comprender el código en sfDomainRoutePlugin.