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

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

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

У вас есть идеи по этому поводу ?

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

7 ответов


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 программно.


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

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

https://github.com/orchestral/tenanti

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


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


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

  • создать одну базу данных на домен

  • настройка доступных подключений к БД в laravel config/database.php :

'connections' => [

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

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

    создать middleware и в 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, используемое всем приложением для текущего цикла запроса


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

$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 для вашей справки.


вот как я бы подошел к этому:

в своем конфигурация / база данных.в 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 версии трудно.


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

Я просто помещаю простой переключатель во главе/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',
             ],
        ]
    ];

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