我将开始使用具有主读/写和从属只读设置的RDS。
我已经阅读了Doctrine MasterSlaveConnection类型。
但是,我创建了一些端点,我想使用只读副本(大多数GET端点),而某些端点需要写数据(PUT,PATCH,DELETE端点)。
我也在使用API平台。
在Symfony 4和Doctrine 2中实现此目标的最佳方法是什么?
我过去所做的只是使用不同的连接。
类似:
doctrine:
dbal:
default_connection: default
connections:
default:
# This is your Master
url: '%env(DATABASE_URL)%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
slave:
# This would be the slave
url: '%env(DATABASE_SLAVE_URL)%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
orm:
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
Main:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: Main
slave:
connection: slave
mappings:
Main:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: Main
https://symfony.com/doc/current/doctrine/multiple_entity_managers.html
然后,在您的控制器或业务逻辑中,您可以选择使用默认的实体管理器:
// Controller
$this->getDoctrine()->getEntityManager();
或者您可以获得从属连接:
// Controller
$this->getDoctrine()->getEntityManager('slave');
如果您只需要处理所有请求而不必为所有内容创建特殊操作,那么最好的办法就是装饰Collection和Item DataProviders来提供理论知识。
https://symfony.com/doc/current/service_container/service_decoration.html
https://github.com/api-platform/core/blob/master/src/Bridge/Doctrine/Orm/CollectionDataProvider.php
https://github.com/api-platform/core/blob/master/src/Bridge/Doctrine/Orm/ItemDataProvider.php
因此,基本上,您需要根据$opperationName
来更改选择哪个经理:
if($opperationName === 'GET'){
$manager = $this->managerRegistry->getManager('slave');
} else {
$manager = $this->managerRegistry->getManager();
}