mapeveri/multi-tenancy-bundle

多租户,是一个用于symfony和doctrine以简单方式管理租户的包。

安装: 7

依赖: 0

建议者: 0

安全: 0

星标: 11

关注者: 4

分支: 3

开放问题: 2

类型:symfony-bundle

dev-master / 1.0.x-dev 2022-09-13 13:04 UTC

This package is auto-updated.

Last update: 2024-09-13 17:25:31 UTC


README

多租户,是一个用于symfony和doctrine以简单方式管理租户的包。该包有2个主要实体

  • 租户
  • 主机名

基本上,租户是重用您的默认代码的方式,而一个主机名是FQDN(完全限定域名),例如:tenant.example.com,该包根据此FQDN设置租户连接。

安装

通过composer

    composer require mapeveri/multi-tenancy-bundle

配置

  1. 配置.env文件

MySQL

DATABASE_URL="mysql://user:password8@127.0.0.1:3306/databaseName?serverVersion=5.7&charset=utf8"
DATABASE_TENANT_URL=${DATABASE_URL}

PostgreSQL

DATABASE_URL="postgresql://user:password@localhost:5432/databaseName?charset=utf8"
DATABASE_TENANT_URL=${DATABASE_URL}
  1. doctrine.yaml配置

MySQL

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                url: '%env(resolve:DATABASE_URL)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4

            tenant:
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
                url: '%env(resolve:DATABASE_TENANT_URL)%'
                wrapper_class: MultiTenancyBundle\Doctrine\DBAL\TenantConnectionWrapper

    orm:
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                mappings:
                    Main:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Main'
                        prefix: 'App\Entity\Main'
                        alias: Main
                    MultiTenancyBundle:
                        is_bundle: true
                        type: annotation
                        dir: 'Entity'
                        prefix: 'MultiTenancyBundle\Entity'
                        alias: MultiTenant
            tenant:
                connection: tenant
                mappings:
                    Tenant:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Tenant'
                        prefix: 'App\Entity\Tenant'
                        alias: Tenant

PostgreSQL

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                url: '%env(resolve:DATABASE_URL)%'
                driver: 'pdo_psql'
                server_version: '12.8'
                charset: utf8mb4

            tenant:
                driver: 'pdo_psql'
                server_version: '12.8'
                charset: utf8mb4
                schema_filter: ~^(?!public)~
                url: '%env(resolve:DATABASE_TENANT_URL)%'
                wrapper_class: MultiTenancyBundle\Doctrine\DBAL\TenantConnectionWrapper

    orm:
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                mappings:
                    Main:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Main'
                        prefix: 'App\Entity\Main'
                        alias: Main
                    MultiTenancyBundle:
                        is_bundle: true
                        type: annotation
                        dir: 'Entity'
                        prefix: 'MultiTenancyBundle\Entity'
                        alias: MultiTenant
            tenant:
                connection: tenant
                mappings:
                    Tenant:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Tenant'
                        prefix: 'App\Entity\Tenant'
                        alias: Tenant
  1. 配置doctrine_migrations.yaml
doctrine_migrations:
  migrations_paths:
    'DoctrineMigrations': 'migrations/Main'
    'DoctrineMigrationsTenant': 'migrations/Tenant'

重要的是要保留 DoctrineMigrations 和 DoctrineMigrationsTenant 命名空间。

  1. 将包添加到bundles.php
return [
    ...
    MultiTenancyBundle\MultiTenancyBundle::class => ['all' => true],
    ...
];

主数据库命令

在这种情况下,我们可以使用doctrine命令

    php bin/console doctrine:migrations:status
    php bin/console doctrine:migrations:diff
    php bin/console doctrine:migrations:migrate

租户命令

生成迁移

    php bin/console tenancy:diff tenant

迁移状态

    php bin/console tenancy:status tenant --tenant=tenant1

迁移单个租户

    php bin/console tenancy:migrate tenant --tenant=tenant1

迁移所有租户

    php bin/console tenancy:migrate tenant

在所有情况下,第一个参数是实体管理器名称,而选项--tenant是租户名称。

支持数据库

目前它支持MySQL和PostgreSQL。

使用方法

创建新的租户

        $entityManager = $this->getDoctrine()->getManager();

        $tenant = new Tenant();
        $uuid = Uuid::v4();
        $tenant->setUuid($uuid->toRfc4122());
        $entityManager->persist($tenant);
        $entityManager->flush();

        $hostname = new Hostname();
        $hostname->setTenant($tenant);
        $hostname->setFqdn("tenant1");

        $entityManager->persist($hostname);
        $entityManager->flush();

删除租户

        $doctrine = $this->getDoctrine();
        $entityManager = $doctrine->getManager();

        $hostname = $doctrine
            ->getRepository(Hostname::class)
            ->find($hostId);
        $entityManager->remove($hostname);

        $tenant = $doctrine
            ->getRepository(Tenant::class)
            ->find($tenantId);

        $entityManager->remove($tenant);
        $entityManager->flush();

事件

该包使用事件调度器组件来分发事件,这些事件是:MultiTenancyEvents::TENANT_CREATED 和 MultiTenancyEvents::TENANT_REMOVED。