Ce que j'ai fait dans le passé, c'est d'utiliser des connexions différentes.
Quelque chose comme :
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
Ensuite, dans vos contrôleurs ou votre logique métier, vous pouvez choisir d'utiliser le gestionnaire d'entités par défaut :
// Controller
$this->getDoctrine()->getEntityManager();
Ou vous pouvez obtenir la connexion d'esclave :
// Controller
$this->getDoctrine()->getEntityManager('slave');
Si vous avez besoin que cela fonctionne pour toutes les requêtes sans avoir à créer des actions spéciales pour chacune d'entre elles, votre meilleure option est de décorer les DataProviders Collection et Item pour la doctrine.
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
En fait, vous devez changer le gestionnaire qui est choisi en fonction de l'adresse de l'utilisateur. $opperationName
quelque chose comme :
if($opperationName === 'GET'){
$manager = $this->managerRegistry->getManager('slave');
} else {
$manager = $this->managerRegistry->getManager();
}
1 votes
@qdequippe oui en termes de simple lecture de données (ce qui serait la plupart de mes requêtes GET REST API)