vivait / tenant-bundle
租户包
Requires
- php: >=5.3.2
- symfony/framework-bundle: ~2.3|~3.0
Requires (Dev)
- behat/behat: ~3.0
- behat/symfony2-extension: ~2.0
- phpspec/phpspec: ~2.0
- phpunit/phpunit: ~3.7.0|~5.4.6
README
允许为每个租户分别设置Symfony环境
安装
步骤 1:下载包
打开命令行,进入您的项目目录,并执行以下命令以下载此包的最新稳定版本
$ composer require vivait/tenant-bundle
此命令需要您全局安装Composer,具体请参阅Composer文档中的安装章节。
步骤 2:启用包
然后,通过在您的项目中的 app/AppKernel.php
文件中添加以下行来启用此包
<?php // app/AppKernel.php // ... class AppKernel extends Kernel { public function registerBundles() { $bundles = array( // ... new Vivait\TenantBundle\VivaitTenantBundle(), ); // ... } // ... }
步骤 3:修改您的内核以实现租户化
由于内核环境是不可变的,我们需在启动内核之前解析租户。我们为您的AppKernel创建了一个租户化内核来扩展,该内核作为中间件作用于Symfony的Kernel。在使用此中间件时,您需要实现几个方法。
第一个抽象方法 getAllTenants
用于返回一个包含租户对象的数组。虽然已经提供了一些提供者,但如果需要,也可以实现自定义逻辑。
第二个抽象方法 getCurrentTenantKey
用于定位当前租户,以便内核可以根据此修改环境。虽然已经提供了一些定位器,但如果需要,也可以实现自定义逻辑。
以下是这两个方法的实现示例,如果您对其中任何内容不确定,这是一个推荐的起点
<?php // app/AppKernel.php use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\HttpFoundation\Request; use Vivait\TenantBundle\Kernel\TenantKernel; use Vivait\TenantBundle\Locator\HostnameLocator; use Vivait\TenantBundle\Provider\ConfigProvider; use Vivait\TenantBundle\Provider\TenantProvider; // ... class AppKernel extends TenantKernel { // ... /** * Provides an array of all Tenants * * @return Tenant[] */ protected function getAllTenants() { $configProvider = new ConfigProvider( __DIR__ . '/config/' ); return $configProvider->loadTenants(); } /** * Provides the current tenant's key * @param Request $request * @return string The current tenant's key */ protected function getCurrentTenantKey( Request $request ) { return HostnameLocator::getTenantFromRequest( $request ); } }
步骤 4:为每个租户创建环境
Symfony将为每个租户自动创建一个环境。但是,如果您选择使用由Symfony提供的默认 AppKernel::registerContainerConfiguration
方法,那么您将需要为每个租户环境创建一个新的配置文件。每个租户环境都以 'tenant_' 为前缀,因此如果您有一个名为 'mytenant' 的租户,则您需要创建 'app/config/config_tenant_mytenant.yml'
。您可以通过更改您的 AppKernel::registerContainerConfiguration
方法来配置此行为,但您还需要自定义ConfigProvider中使用的模式以匹配配置结构的更改。
您还可以使用其他提供者来提供租户列表,例如有一个YamlProvider可以从YAML文件中检索租户列表。
针对租户运行命令
由于每个租户现在都在独立的环境中运行,当您更新应用程序时,您将需要针对每个租户的环境运行缓存清除或doctrine迁移等命令。已经提供了一个特殊的二进制文件来简化此过程,并且您只需在您通常使用的命令前加上 tenant
二进制文件即可。
bin/tenant php app/console cache:clear
这将自动对所有租户运行缓存清除命令。
并行命令 & 守护进程
如果您想在并行中运行命令,例如守护进程命令,则可以使用 -P
选项来指定。
bin/tenant -P 10 php app/console my:daemon:command
在上面的示例中,这将并行运行针对最多10个租户的缓存清除命令。如果您将 -P
指定为0,则二进制文件将自动将进程数设置为与租户数匹配。
指定特定租户
您可以使用 -t
选项来指定针对哪些租户运行命令。
bin/tenant -t mytenant,anothertenant php app/console cache:clear
其他选项
您可以使用 -h 获取完整的选项列表。
bin/tenant -h