Я пытаюсь соответствовать субдоменам к идентификатору клиента в симфонии.
т.е. у меня есть customer1.example.com и customer2.example.com
Домены хранятся в таблице.
Когда пользователь переходит к customer1.example.com, я хотел бы получить субдомен, искать доменное имя в базе данных, когда-то подобранной, это затем развернет конфигурацию приложения для того клиента и затем сохранит customer_Id в глобальном атрибуте, таким образом, я буду знать точно, с каким клиентом я имею дело всюду по целому приложению. Виртуальный хост будет иметь соответствующее подстановочное имя сервера.
Вам удалось достигнуть этого, и если так, как? В противном случае любые идеи были бы большой справкой!
Я думаю об использовании фильтра делать это.
:-)
также потребуется установить свой домен как домен с подстановочными знаками, если нет, вам нужно будет вручную создавать каждый поддомен для каждого клиента.
другое решение, которое не так сильно зависит от симфонии, - это использование .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 вы можете проверить, совпадает ли оно с именем пользователя вашего клиента. и позволяют одновременно использовать припаркованные домены для своих клиентов.
Надеюсь, это поможет.
Я делаю нечто подобное. Обратите внимание, я не пробовал именно эту установку.
$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();
}
Поскольку вы хотите загрузить другое приложение, фильтр не поможет. Просто используйте frontcontroller (index.php) для извлечения поддомена, и, если каталог приложения существует, загрузите приложение (иначе 404). Вы даже можете сохранить идентификатор в конфигурации приложения.
Посмотрите на sfDomainRoutePlugin - он делает то, что вы хотите. Однако в его текущей версии вы не получаете функциональность Propel или DoctrineRoute, что означает, что вы должны вручную искать клиента на основе параметра субдомена, возвращаемого плагином. Пример:
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/customer/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 в книге "More with symfony book". Это поможет вам понять код в sfDomainRoutePlugin.