Я пишу API
с использованием SLIM , целью этого API является создание мультитенантной структуры. Пока что я сделал следующее:
Прежде всего, я создал master базу данных, которая содержит всех моих клиентов (которые купили мое программное обеспечение), для каждого клиента у меня есть поле с именем CUSTOMER_TOKEN
, которое представляет учетные данные для доступа к API.
По сути, у меня здесь два ПО:
- API: чтение данных из базы данных клиентов.
- Основное приложение: используйте API.
Infact, у каждого арендатора есть своя база данных, я считаю этот способ лучшим выбором для меня.
Основное приложение получает токен JWT
, отправляющий запрос на API
с помощью CUSTOMER_TOKEN
, например:
http://xxx.xxx.xxx.xxx/v1/auth/login
вышеприведенный маршрут проверит существование клиента в базе данных master , если она существует, затем вернет маркер временного доступа для использования API
(JWT).
Пока все хорошо. Главная проблема здесь. Фактически, если у пользователя есть JWT
и CUSTOMER_TOKEN
допустим, тогда API
должен создать соединение с базой данных tenant
, а не с master базой данных.
На данный момент для управления основным соединением я использую контейнер SLIM
, в частности:
<?php
use Slim\Container;
$container = $app->getContainer();
$container['pdo'] = function (Container $c) {
$db = $c['settings']['db'];
$pdo = new PDO(
"mysql:host=" . $db['host'] . ";dbname=" . $db['dbname'],
$db['user'],
$db['pass']
);
return $pdo;
};
как мне отсюда создать другое соединение с базой данных клиентов? Должен ли я использовать middleware
? Должен ли я проверить запрошенный маршрутизатор, чтобы понять, нужен ли мне главный или арендатор базы данных?
Обратите внимание, что для каждого арендатора я использую структуру соглашения имен, такую как:
app_name-tenant-tenant_name
Итак, у меня есть префикс app_name-tenant
, а затем tenant_name
. Поэтому мне нужно только получить имя customer
от master db для сборки соединения.
Как бы вы справились с этой ситуацией? спасибо.