我是人!第一:抱歉我的英语(我改进了......)。感谢编辑de post以纠正它:)
我正在symfony上实施SaaS app多租户。我希望与社区分享我使用的方式是什么(mae不是最好的,但它工作得很好......)。
概念:
第一:安排配置
我已将配置文件排列在以下文件夹中:
-app
---config
-----tenantA
--------config.yml
--------config_dev.yml
--------config_prod.yml
--------parameters.yml
-----tenantB
--------config.yml
--------config_dev.yml
--------config_prod.yml
--------parameters.yml
-----services.yml
-----security.yml
DISPATCHER
在AppKernel上我修改了registerContainerConfiguration动作。它加载de general configuration(DB参数,twig globals等)。
原件:
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load($this->getRootDir().'/config/config_'.$this->getEnvironment().'.yml');
}
新(我使用子域来设置symfony必须加载的环境:
public function registerContainerConfiguration(LoaderInterface $loader)
{
$url= $_SERVER['HTTP_HOST'];
$partes = explode('.',$url);
$tenant= $partes[0]; // this get de subdomain. If the access is www.tenant1.myapp.com this returns tenant1.
$loader->load($this->getRootDir().'/config/'.$tenant.'/config_'.$this->getEnvironment().'.yml');
}
此功能转到租户文件夹并使用他的parameters.yml
加载配置文件安排高速缓存和日志文件夹
我修改了AppKernel,包括函数getCacheDir和getLogDir,以便设置正确的文件夹来保存文件:
public function getCacheDir()
{
return $this->rootDir . '/cache/' . $tenant. '/' . $this->environment;
}
public function getLogDir()
{
return $this->rootDir . '/logs/' . $tenant. '/' . $this->environment;
}
这样保存文件:
-cache
---tenant1
-----dev
-----prod
---tenant2
-----dev
-----prod
-logs
---tenant1
-----dev.log
-----prod.log
----tenant2
------dev.log
------prod.log
CSS BY TENANT
我已经按照这样的方式安排了我的css文件:
--web
---css
----tenant1.css
----tenant2.css
----tenantN.css
然后,在每个租户的config.yml中(提醒app-> config上的已排列文件夹)我使用了一个全局tiwg,其名称为租户的css主题:
twig:
globals:
app_css: tenant1.css
然后,在我已经宣布css文件并包含在基本树枝中的tiwg中,我通过以下方式调用css:
{% set cssload = "css/" ~ app_css ~ ".css" %}
<link rel="stylesheet" href="/{{cssload}}">
由于缓存保存在diferents文件夹中,因此tenant1的CSS不会影响缓存和tenant2的css。
结束:我不知道这是不是一个好习惯,但它运作正常,而且它是另一个解决方案。
感谢大家帮助这几天!!!!!