Да) какие подводные камни может быть)
Как более еще производительно сделать?
Какие сложности нас ожидает!
Как на стороне кода все это сделать (хотя я это уже понял почти но может еще кому-то надо будет)
> как на стороне кода
В случае одного приложения пишем локатор подключений:
class Connections
{
__construct($configTemplate)
get($tenantId)
}
который будет создавать подключение по шаблону конфигов, меняя имя базы вроде str_replace($dsn, '{tenant_id}', $tenantId), и это подключение сохранять в приватный массив.
И также делаем локатор Em:
class EntityManagers
{
__construct($connections)
get($tenantId)
}
С созданием подключения и таким же кешированием:
class EntityManagers
{
private Connections $conns;
private array $ems = [];
get($tId) {
if (arr_key_ex($this->ems, $tId)) {
return $this->ems[$tId];
}
$conn = $this->conns->get($tId);
$em = new EntMngr($conn);
$this->ems[$tId] = $em;
return $em;
}
}
Сократил, чтобы влезало в экран.
И теперь во все сервисы инжектим эти локаторы и во все методы передаём из контроллера значение $this->getUser()->getId() в $tenantId, чтобы потом в сервисах вызывать $em = $this->ems->get($tenantId).
В итоге в проекте будут и стандартные $em и $connection для работы с общей базой пользователей для аутентификации, и отдельные пользовательские $ems->get($tId) и $conns->get($tId).