Symfony SAAS多租户(DB by tenant)。分享我的实施

时间:2017-01-17 08:39:58

标签: symfony caching login multi-tenant saas

我是人!第一:抱歉我的英语(我改进了......)。感谢编辑de post以纠正它:)

我正在symfony上实施SaaS app多租户。我希望与社区分享我使用的方式是什么(mae不是最好的,但它工作得很好......)。

概念:

  • 一个代码(一个应用)。
  • 每个租户的数据库
  • 每个租户的CSS
  • 每个客户都有一个子域名(www.tenant1.myapp.com,www.tenant2.myapp.com)

第一:安排配置

我已将配置文件排列在以下文件夹中:

-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。

结束:我不知道这是不是一个好习惯,但它运作正常,而且它是另一个解决方案。

感谢大家帮助这几天!!!!!

0 个答案:

没有答案