Как я могу обрабатывать субдомены с одной установкой laravel

Я создаю проект laravel, для которого мне нужна одна установка laravel, и используйте его экземпляр в поддомене с отдельной базой данных. И эти отдельные данные базы данных не будут в config/database.php. Он будет получать из основной базы данных, а затем снова подключиться к другой базе данных.

Я не нашел подходящего способа сделать это.

Есть ли у вас какие-либо идеи по этому поводу?

Спасибо за ваше время.

Ответ 1

Laravel поддерживает несколько соединений с базой данных. Во-первых, определите соединения в config/database.php:

<?php
return array(

    'default' => 'default_connection',

    'connections' => array(

        // domain.com
        'default_connection' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'primary_database',
            'username'  => 'username',
            'password'  => 'password'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

        // sub.domain.com
        'subdomain_connection' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'secondary_database',
            'username'  => 'username',
            'password'  => 'password'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    ),
);

Теперь, чтобы указать, какое соединение должны использовать ваши модели, вы можете установить свойство $connection в своих моделях:

<?php

class YourModel extends Eloquent {

    protected $connection = 'subdomain_connection';

}

Вы можете программно установить значение $connection.

Ответ 2

Multi-tenancy - сложная архитектура, нуждающаяся в моделировании. Существует несколько способов достижения этой архитектуры. Некоторые решают использовать одну базу данных, другие предпочитают использовать несколько баз данных (что в вашем случае).

У них обоих есть свои плюсы и минусы, которые вам нужно учитывать. Есть много факторов, которые необходимо учитывать, прежде чем вы начнете моделировать свое приложение. например, конфигурация виртуального хоста для поддоменов, миграция базы данных (откат всех баз данных при необходимости и т.д.). Я предлагаю эти два пакета, которые могут помочь вам, и дать вам больше информации о том, как смоделировать приложение в пакете, что вы хотите.

https://github.com/orchestral/tenanti

https://github.com/hyn/multi-tenant

Ответ 3

Я бы сделал так:

  • Создайте одну базу данных на домен

  • Настройте доступные соединения DB в laravel config/database.php:

'connections' => [

     'mysql_domain_1' => [
        'driver'    => 'mysql',
        /* other config values... */
    ],

    'mysql_domain_2' => [
        'driver'    => 'mysql',
        /* other config values... */
    ]
];
  • В ранней фазе цикла запроса (например, в промежуточном программном обеспечении) получить поддомен из запроса и соответственно установить текущее соединение с БД

    Например, создайте промежуточное программное обеспечение и метод handle:

public function handle($request, Closure $next)
{
    //check the request URL and get subdomain

    //get the db connection associated to the subdomain 

    //set the connection for this request
    Config::set('database.default', $dbConnection);
} 

Config::set('database.default', $dbConnection ); установит соединение db, используемое всем приложением для текущего цикла запроса

Ответ 4

Если вы хотите обработать это из базы данных, тогда проверьте имя хоста с http-url и вызовите соединение с базой данных из главной таблицы в соответствии с именем хоста. например (http://abc.maindomain.com, получите abc из URL-адреса)

Ответ 5

Вы можете установить конфигурацию БД, выполнив следующие действия:

$tenant = Tenant::whereSubDomain($subdomain)->first();  
Config::set('database.connections.mysql.database', $tenant->db_name);       
Config::set('database.connections.mysql.username',$tenant->db_username);
Config::set('database.connections.mysql.password',$tenant->db_password);

dd(\DB::connection('mysql'));

См. ссылку Настройте динамическое подключение к базе данных в приложении Multi tenant для справки.

Ответ 6

Вот как я хотел бы подойти к этому:

В вашем файле config/database.php:

<?php
function getDatabaseConnectionParameters() {
    $connectionParams = array();

    // add the default connection
    // this is your master database
    $connParams = array(
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'database'  => 'master',
        'username'  => 'master_user',
        'password'  => 'master_password',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    );
    array_push($connectionParams, array('mysql' => $connParams);

    // TODO: connect to your master database using PDO/mysqli or anything else you know.
    // The point is: you can't use Laravel ORM just yet because you are currently setting up its configuration!
    // Get the list of subdomain connection parameters and array_push it to $connectionParams just like above.
    // Example:
    // array_push($connectionParams, array('subdomain' => $subdomainConnParams)

    return $connectionParams;
}

return array (
    'default' => 'mysql'

    ,'connections' => getDatabaseConnectionParameters()
)
?>

При этом конкретным моделям поддоменов нужно только правильно указать $connection. Пример:

<?php
class YourModel extends Eloquent {
    protected $connection = 'subdomain';
}
?>

Таким образом, конфигурации базы данных субдоменов могут быть сохранены в вашей основной базе данных, делая ваши модели простыми и все же Laravel-ful. Кроме того, нет неприятных хаков, которые могли бы улучшить версию Laravel.

Ответ 7

Просто наткнулся на этот вопрос, и ИМХО иногда самое простое предложение - самое легкое.

Я просто поместил простой ключ в начало файла /config/database.php:

switch($_SERVER['HTTP_HOST'])
{
case 'dev.yoursite.com':
    $selectedDatabase = 'mysite_dev';
    break;
case 'yoursite.com':
default:
    $selectedDatabase = 'mysite_live';
    break;
}

Затем просто используйте переменную в возвращаемой переменной конфигурации.

return [
    'connections' => 
        ['mysql' =>
             ['database' => $selectedDatabase,
              'username' => 'user_name',
              'password' => 'xxxxxxxxx',
             ],
        ]
    ];

Я знаю, что это не ларавийский путь, но он избавит вас от исправления, если вы просто хотите открыть среду быстрого тестирования с использованием того же PHP-кода, но тестовый экземпляр вашей базы данных.