Рейтинг:2

Как проверить, существует ли определение вторичной базы данных

флаг fr

Может ли кто-нибудь помочь мне, как проверить, установлена ​​​​ли вторичная база данных. Если не скинуть ошибку.

В настоящее время я определяю соединение с базой данных, как показано ниже.

База данных::getConnection('по умолчанию', 'sqlite')

Я пытаюсь определить условие if , else на основе определения базы данных.

Когда я пытаюсь

если(База данных::getConnection('по умолчанию', 'sqlite')){
  повторить успех;
}еще {
  эхо сбой;
}

Я получаю ошибку ниже. Если определение вторичной базы данных не определено в settings.php

Исключение Drupal\Core\Entity\EntityStorageException: 
Указанное соединение с базой данных не определено: sqlite в Drupal\Core\Entity\Sql\SqlContentEntityStorage->save() (строка 811 core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php).
Рейтинг:2
флаг us

Чтобы проверить, было ли определено соединение, я бы использовал код, подобный следующему.

if ($connections = Database::getAllConnectionInfo() && isset($connections['default']['sqlite'])) {
  // Соединение установлено.
} 

База данных::getConnection() возвращает объект соединения, и он может вернуть объект для основного/по умолчанию сервера, когда запрошенная информация предназначена для игнорируемого соединения или запрошенное соединение не определено.

  // Если запрошенная цель не существует или если она игнорируется, мы отступаем
  // к цели по умолчанию. Цель обычно либо "по умолчанию", либо
  // "реплика", указывающая на использование реплики SQL-сервера, если она доступна. Если
  // это недоступно, тогда сервер по умолчанию/основной является правильным сервером
  // использовать.
  if (!empty(self::$ignoreTargets[$key][$target]) || !isset(self::$databaseInfo[$key][$target])) {
    $цель = 'по умолчанию';
  }
  if (!isset(self::$connections[$key][$target])) {

    // При необходимости открывается новое соединение.
    self::$connections[$key][$target] = self::openConnection($key, $target);
  }

Это означает, что ожидание исключения из База данных::getConnection() когда соединение не определено, это неправильно.

miststudent2011 avatar
флаг fr
Спасибо, это лучше, чем другой ответ.
Рейтинг:1
флаг id
пытаться {
    $connection = Database::getConnection('по умолчанию', 'sqlite');
}
catch (Drupal\Core\Entity\EntityStorageException $e) {
    // Сделайте что-нибудь здесь.
}
Ну наконец то {
    // Необязательно: сделать что-то в любом случае.
}
miststudent2011 avatar
флаг fr
Спасибо, это работает. Но просто интересно, есть ли у нас какой-нибудь метод в ядре, чтобы проверить, существует ли соединение. Что-то вроде `hasConnection()`
Рейтинг:-1
флаг fr

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

пытаться {
  $connection = Database::getConnection('по умолчанию', 'sqlite');
} поймать (\Exception $e) {
  return new \Exception("Конфигурация базы данных SQLite не настроена.", 1);
}

Создал основную проблему #3282024 чтобы добавить собственный метод для проверки подключения к базе данных.

флаг id
Вам может понадобиться косая черта перед исключением, например \Drupal\Core\Entity\EntityStorageException. \Exception может быть вообще чем угодно.
miststudent2011 avatar
флаг fr
Добавление косой черты приводит к той же ошибке.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.