mapeveri / multi-tenancy-bundle
多租户,是一个用于symfony和doctrine以简单方式管理租户的包。
dev-master / 1.0.x-dev
2022-09-13 13:04 UTC
Requires
- php: >=7.3
- doctrine/annotations: ^1.0
- doctrine/doctrine-bundle: ^2.2
- doctrine/doctrine-migrations-bundle: ^3.0
- doctrine/orm: ^2.8
- symfony/console: 5.2.*
- symfony/event-dispatcher: 5.2.*
- symfony/expression-language: 5.2.*
- symfony/property-access: 5.2.*
- symfony/property-info: 5.2.*
- symfony/serializer: 5.2.*
- symfony/uid: 5.2.*
- symfony/yaml: 5.2.*
Requires (Dev)
- symfony/phpunit-bridge: ^5.2
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
配置
- 配置.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}
- 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
- 配置doctrine_migrations.yaml
doctrine_migrations: migrations_paths: 'DoctrineMigrations': 'migrations/Main' 'DoctrineMigrationsTenant': 'migrations/Tenant'
重要的是要保留 DoctrineMigrations 和 DoctrineMigrationsTenant 命名空间。
- 将包添加到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。