Puncte:2

Cum se verifică dacă există o definiție secundară a bazei de date

drapel fr

Poate cineva să mă ajute, vă rog, cum să verific dacă baza de date secundară este setată. Dacă nu aruncați o eroare.

În prezent, definesc conexiunea la baza de date ca mai jos.

Baza de date::getConnection('default', 'sqlite')

Încerc să definesc o condiție if , else bazată pe definirea bazei de date.

Când încerc

if(Bază de date::getConnection('default', 'sqlite')){
  ecou succes;
}altfel {
  ecou eșec;
}

Primesc mai jos eroarea. Dacă definiția secundară a bazei de date nu este definită în settings.php

Drupal\Core\Entity\EntityStorageException: 
Conexiunea la baza de date specificată nu este definită: sqlite în Drupal\Core\Entity\Sql\SqlContentEntityStorage->save() (linia 811 din core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php).
Puncte:2
drapel us

Pentru a verifica dacă a fost definită o conexiune, aș folosi un cod similar cu următorul.

if ($connections = Database::getAllConnectionInfo() && isset($connections['default']['sqlite'])) {
  // Conexiunea este definită.
} 

Baza de date::getConnection() returnează un obiect de conexiune și l-ar putea returna pe cel pentru serverul implicit/primar, atunci când informațiile solicitate sunt pentru o conexiune ignorată sau conexiunea solicitată nu este definită.

  // Dacă ținta solicitată nu există sau dacă este ignorată, ne întoarcem
  // la ținta implicită. Ținta este de obicei fie „implicit”, fie
  // „replica”, indicând utilizarea unui server SQL de replică dacă este disponibil unul. Dacă
  // nu este disponibil, atunci serverul implicit/primar este serverul corect
  // a folosi.
  if (!empty(self::$ignoreTargets[$key][$target]) || !isset(self::$databaseInfo[$key][$target])) {
    $target = 'implicit';
  }
  dacă (!isset(self::$conexiuni[$cheie][$țintă])) {

    // Dacă este necesar, se deschide o nouă conexiune.
    self::$connections[$key][$target] = self::openConnection($key, $target);
  }

Aceasta înseamnă că așteaptă o excepție de la Baza de date::getConnection() când conexiunea nu este definită este greșită.

miststudent2011 avatar
drapel fr
Mulțumesc, este mai bun decât celălalt răspuns.
Puncte:1
drapel id
încerca {
    $connection = Database::getConnection('default', 'sqlite');
}
catch (Drupal\Core\Entity\EntityStorageException $e) {
    // Fă ceva aici.
}
in cele din urma {
    // Opțional: faceți ceva în orice caz.
}
miststudent2011 avatar
drapel fr
Mulțumesc, funcționează. Dar mă întrebam dacă avem vreo metodă în nucleu pentru a verifica dacă conexiunea există. Ceva de genul `hasConnection()`
Puncte:-1
drapel fr

Cu toate că cilefen m-a îndreptat în direcția bună. Încă mai aruncă o eroare fatală când folosești răspunsul lui cilefen. Pot să rezolv această problemă modificând ușor gestionarea excepțiilor.

încerca {
  $connection = Database::getConnection('default', 'sqlite');
} captură (\Excepție $e) {
  return new \Exception("Configurarea bazei de date SQLite nu este configurată.", 1);
}

A creat o problemă de bază #3282024 pentru a adăuga metoda nativă pentru a verifica conexiunea la baza de date.

drapel id
Este posibil să aveți nevoie de o bară oblică înainte de excepție, cum ar fi \Drupal\Core\Entity\EntityStorageException. \Excepția ar putea fi orice.
miststudent2011 avatar
drapel fr
Adăugarea slash produce aceeași eroare.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.