gam6itko/doctrine-multibase-bundle

允许动态地在多个实例之间切换基础Doctrine连接

安装次数1,987

依赖者: 0

建议者: 0

安全性: 0

星标: 0

关注者: 3

分支: 0

公开问题: 0

类型:symfony-bundle

v0.2.1 2020-05-16 21:10 UTC

This package is auto-updated.

Last update: 2024-09-17 06:49:08 UTC


README

允许动态地在多个实例之间切换基础Doctrine连接。

让我们想象你有一个自己的CRM,它拥有许多账户。你希望每个账户的数据都存储在自己的数据库中。在这种情况下,你需要有一个可以动态切换到所需账户的连接。这个库在这里可能会有用。

安装

composer require gam6itko/doctrine-multibase-bundle

配置

首先,你需要配置可切换的Doctrine连接。

## doctrine.yaml

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
               # your system database connection which contains accounts
            account: # switchable connection
                driver:   "%database_driver%"
                host:     "%database_host%"
                port:     "%database_port%"
                dbname:   "%database_name_account_prefix%"
                user:     "%database_user%"
                password: "%database_password%"

    orm:        
        entity_managers:
            default:
                # something here 
            account:
                connection: account # dynamic connection
                mappings:
                    AppAccountDataBundle: ~

注册连接切换器

# services.yaml

Gam6itko\MultibaseBundle\Doctrine\ConnectionSwitcher:
    public: true
    arguments: ['@doctrine.dbal.account_connection', '%database_name_account_prefix%']
    calls:
        - [setEventDispatcher, ['@event_dispatcher']]

创建数据库

php bin/console multibase:database:create account database_account 1917
php bin/console multibase:schema:create account database_account 1917

最后,当你需要时,将模拟账户连接切换到真实连接。例如,在用户登录时进行操作。

# services.yaml

App\EventListener\AccountConnectionListener:
    calls:
        - [setConnectionSwitcher, ['@Gam6itko\MultibaseBundle\Doctrine\ConnectionSwitcher']]
    tags:
        - {name: kernel.event_listener, event: kernel.request}
# App\EventListener\AccountConnectionListener 

class AccountConnectionListener
{
    use ConnectionSwitcherAwareTrait;

    public function onKernelRequest(GetResponseEvent $event)
    {
        $user = $this->getUser();
        $this->connectionSwitcher->switchTo($user->getAccount()->getId());
    }
}