Нужно сделать подобие маркетплейса на laravel с мини сайтами для каждого магазина
Как я это вижу
2-ве платформы на laravel
1- Основной сайт, где происходит выгрузка все информации c мини сайтов
2- Платформа для мини сайтов
Для каждого мини сайта использовать свою БД, вернее свой префикс в БД
(У каждого сайта есть свои категории, динамические страницы, товары, настройки, грубо говоря 4-ре таблицы(пока) в БД для каждого мини сайта) и свой .env фаил
Получается, нужно реализовать подключение к разным БД у одного проекта
Как это сейчас работает:
В файле `/bootstrap/app.php`
Добавил код
if (isset($_SERVER['HTTP_HOST'])) {
$host = idn_to_utf8($_SERVER['HTTP_HOST'], 0, INTL_IDNA_VARIANT_UTS46);
$envFile = sprintf('site/%s', $host);
if ($host && file_exists(sprintf('%s/%s', $app['path.base'], $envFile))) {
$app->loadEnvironmentFrom($envFile);
}
}
При заходе на любой домен(привязанный к данному проекту/серверу) ищем в папке `site` фаил с названием домена(в нем хранятся настройки для подключения к БД) и если есть, загружаем его вместо дефолтного `.env` файла
Затем в роутах проверяем, подключились к БД или нет
В `routes/web.php`
try {
DB::connection()->getPdo();
if(DB::connection()->getDatabaseName()){
}
} catch (\Exception $e) {
abort(404);
}
И дальше в этом же файле получаем настройки для данного сайта(Название, телефон..) и кэшируем их
$domain = $_SERVER['HTTP_HOST'] ?? '';
$site = Cache::remember('setting_domain_'.$domain, 1440, function () {
$site = \App\Setting::get()->keyBy('name')->toArray();
return $site;
});
Заносим полученные данные в функцию `config`
config(['siteName' => $site['site_name']['value']]);
В шаблоне получаем
{{Config::get('siteName')}}
Все это работает и вроде как при 10 сайтах полет нормальный
Как данное решение будет вести себя при 1000+ сайтов?
Может кто-нибудь сталкивался с подобной задачей и знает как ее правильно реализовать(с меньшей нагрузкой)