Я хочу разрабатывать веб-приложения на основе кода, каждый сайт имеет свою собственную базу данных, а не о представлениях.Я видел много учебников, использующих DB::connection('connection_name')
в контроллере или установил protected $connection = 'connection_name';
в модели.Мне не нравится этот подход.Я сделал это с другим подходом, и мне интересно, является ли мой подход правильным, эффективным и наилучшей практикой, или это приводит к каким-либо недостаткам.
Вот как я делаю это в Laravel 5.7.
В файле .env
я определяю различные данные базы данных.
DB_CONNECTION='mysql'
DB_HOST='my_h'
DB_PORT='my_p'
DB_DATABASE='my_db'
DB_USERNAME='my_un'
DB_PASSWORD='my_pw'
DOMAIN_NAME_V1 = 'my_domain_v1.com'
TEMPLATE_NAME_V1 = 'my_domain_v1'
DB_CONNECTION_V2='mysql2'
DB_HOST_V2='my_host_v2'
DB_PORT_V2='my_port_v2'
DB_DATABASE_V2='my_db_v2'
DB_USERNAME_V2='my_username_v2'
DB_PASSWORD_V2='my_pw_v2'
DOMAIN_NAME_V2 = 'my_domain_v2.com'
TEMPLATE_NAME_V2 = 'my_domain_v2'
В файле config/database.php
я настраиваю соединения с базой данных следующим образом.
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '1234'),
'database' => env('DB_DATABASE'),
'username' => env('DB_USERNAME'),
'password' => env('DB_PASSWORD'),
'unix_socket' => env('DB_SOCKET'),
],
'mysql2' => [
'driver' => 'mysql',
'host' => env('DB_HOST_V2', '127.0.0.1'),
'port' => env('DB_PORT_V2', '5678'),
'database' => env('DB_DATABASE_V2'),
'username' => env('DB_USERNAME_V2'),
'password' => env('DB_PASSWORD_V2'),
'unix_socket' => env('DB_SOCKET'),
],
]
Я создаю класс ConfigServiceProvider
в каталоге App\Providers
следующим образом.
namespace App\Providers;
class ConfigServiceProvider extends ServiceProvider {
public function register() {
$template = null;
$db_connection = null;
if ( isset($_SERVER["SERVER_NAME"]) ) {
switch ($_SERVER["SERVER_NAME"]) {
case env('DOMAIN_NAME_V1'):
$template = env('TEMPLATE_NAME_V1');
$db_connection = env('DB_CONNECTION');
break;
case env('DOMAIN_NAME_V2'):
$template = env('TEMPLATE_NAME_V2');
$db_connection = env('DB_CONNECTION_V2');
break;
default:
$template = env('TEMPLATE_NAME_V1');
$db_connection = env('DB_CONNECTION');
break;
}
}
$config = app('config');
$config->set('template', $template);
$config->set('database.default', $db_connection);
}
}
Я не включил, как views
в каталоге resources
и как выглядит класс TemplateServiceProvider
, потому что этоВопрос заключается в настройке соединений с несколькими базами данных в зависимости от имени домена для нескольких сайтов на основе кода.
Является ли этот подход правильным способом, эффективным и оптимальным, по сравнению с использованием DB::connection('connection_name')
в контроллере или установкойprotected $connection = 'connection_name';
в модели?Приводит ли это к каким-либо недостаткам?