Эффективно ли и является ли наилучшей практикой конфигурировать приложение Laravel 5.7 на основе кода с различными базами данных, используя этот подход? - PullRequest
0 голосов
/ 18 февраля 2019

Я хочу разрабатывать веб-приложения на основе кода, каждый сайт имеет свою собственную базу данных, а не о представлениях.Я видел много учебников, использующих 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'; в модели?Приводит ли это к каким-либо недостаткам?

...