@nicolaa

Как реализовать маркетплейс на laravel?

Нужно сделать подобие маркетплейса на 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+ сайтов?

Может кто-нибудь сталкивался с подобной задачей и знает как ее правильно реализовать(с меньшей нагрузкой)
  • Вопрос задан
  • 170 просмотров
Пригласить эксперта
Ответы на вопрос 4
Sanes
@Sanes
!
Да нормально будет вести. У вас же предусмотрено горизонтальное масштабирование?
Сайты-доноры могут быть распределены на множество узлов кластера.
Ответ написан
Alex_Wells
@Alex_Wells
PHP/TS/Kotlin developer
Решение очень тупое и неправильное.

Правильно было бы использовать одну БД с нормальной структурой. Подвязывать все что нужно (эти ваши "категории, динамические страницы, товары, настройки") к энтити "мини-сайта" и все.
Ответ написан
@MVP_Master
Одна база, один бэкэнд. Никаких доп баз. С донорами обменивайтесь через api или парсинг.
Ответ написан
@lavren
Мультитенантность.

Это сейчас ты задумываешься только о подключении другой базы. А как же очереди? Файловые системы?

1) оставить .env для серверных настроек
2) оставить конфиги для конфигов, а не для хранения данных
3) Убрать из роутов логику навсегда!
4) есть мощный пакет https://github.com/tenancy/tenancy/tree/master
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы