Как я могу обрабатывать поддомены с одной установкой 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-сложная архитектура, которая нуждается в уходе за моделью. Существует несколько способов достижения этой архитектуры. Некоторые решают использовать одну базу данных, в то время как другие предпочитают использовать несколько баз данных(то есть в вашем случае).
у них обоих есть свои плюсы и минусы, которые вам нужно учитывать. Есть много факторов, которые необходимо учитывать перед началом моделирования приложения. например, конфигурация виртуального хоста для субдоменов, базы данных миграции(откатить все базы данных, когда это необходимо, и т. д.). Я предложу эти два пакета, которые могут помочь вам и дать вам больше информации о том, как смоделировать ваше приложение для набора того, что вы хотите.
Если вы хотите обработать это из базы данных, проверьте имя хоста из 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-кодировку, но тестовый экземпляр вашего база данных.