Динамические поддомены Symfony - PullRequest
11 голосов
/ 07 июня 2010

Я пытаюсь сопоставить субдомены с идентификатором клиента в Symfony.

т.е. у меня есть customer1.example.com и customer2.example.com

Домены хранятся в таблице.

Когда пользователь заходит на customer1.example.com, я хотел бы получить поддомен, найти имя домена в базе данных, после сопоставления он развернет конфигурацию приложения для этого клиента и затем сохранит customer_Id глобальный атрибут, поэтому я точно знаю, с каким клиентом я имею дело во всем приложении. Виртуальный хост будет иметь соответствующее подстановочное имя.

Удалось ли вам этого добиться, и если да, то как? Если нет, то любые идеи будут очень полезны!

Я думаю об использовании фильтра, чтобы сделать это.

: -)

Ответы [ 4 ]

4 голосов
/ 21 июня 2010

также понадобится установить свой домен в качестве домена с подстановочными знаками, если не требуется вручную создавать каждый поддомен для каждого клиента.

другое решение, которое не так сильно зависит от симфонии, использует .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 вы можете проверить, соответствует ли оно вашему имени пользователя клиента. и позволяет вам одновременно использовать припаркованные домены для ваших клиентов.

Надеюсь, это поможет.

1 голос
/ 17 июня 2010

Взгляните на sfDomainRoutePlugin - он делает то, что вы хотите. Однако в его текущей версии вы не получаете функциональность Propel или DoctrineRoute, что означает, что вы должны вручную искать клиента на основе параметра subdomain, возвращаемого из плагина. Пример:

приложение / интерфейс / конфигурации / 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 в книге «Больше с Symfony». Это поможет вам понять код в sfDomainRoutePlugin.

0 голосов
/ 08 июня 2010

Я делаю что-то подобное.Обратите внимание, я не пробовал эту точную настройку.

$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 голосов
/ 08 июня 2010

Поскольку вы хотите загрузить другое приложение, фильтр не поможет. Просто используйте frontcontroller (index.php) для извлечения субдомена, и, если каталог приложения существует, загрузите приложение (иначе 404). Вы даже можете сохранить идентификатор в конфигурации приложения.

...