vivait/tenant-bundle

此包已被弃用且不再维护。没有建议的替代包。

租户包

0.6.3 2022-02-17 17:54 UTC

This package is auto-updated.

Last update: 2022-06-17 18:40:26 UTC


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