dedlfix: Konfiguration auslagern

Beitrag lesen

Tach!

Eine andere Variante ist, dass man statt der Config-Klasse ein Repository erstellt und die eigentlichen Daten in POPO-Klassen[^1] verwaltet, also nackige Klassen, die lediglich Eigenschaften für die Daten enthalten.

Hast du literatur davon, oder reicht ein kleines Metasyntaktisches Beispiel? Also Spannend finde ich das. Danke dafür.

Oftmals braucht man mehrere Werte für eine Konfiguration, und wenn, dann braucht man sie selten einzeln. Für jeden Wert ein extra Funktionsaufruf zu starten ist viel Wiederholarbeit. Für dich, die Aufrufe zu schreiben, und ausgeführt werden müssen sie auch noch. Alle Werte mit einem Aufruf zu holen erspart einiges an Arbeit. Der Start ist, sich erstmal die Klasse zu erstellen, die die Werte transportieren soll.

namespace Config;
class Database {
  public host;
  public database;
  public username;
  public password;
}

Das ist das POPO-Objekt für die Werte. Deine Datenbank-Klasse muss nur diese Werte bekommen. Die muss nicht wissen, dass es da einen Konfigurationsspeicher gibt, wo diese Werte herkommen. Sie bekommt die Daten gebrauchsfertig hereingereicht. Wobei die Erstellung des DSN-Strings datenbankspezifisch ist und die Db\Mysql-Klasse sie sich in einer Hilfsmethode (buildDsn) selbst zusammenbauen kann. Alternativ könnte man auch den fertigen DSN-String in der Konfiguration ablegen und die POPO-Klasse hätte dann $dsn statt $host und $database als Eigenschaften.

namespace Db;
class Mysql {
  private $config;

  function __construct(Config\Database $config) {
    $this->config = $config;
  }
  
  private function connect() {
    $this->pdo = new PDO($this->buildDsn($this->config), 
      $this->config->username, $this->config->password);
    // ...
  }

  // andere Dinge die so eine Datenbankklasse tun muss
}

Das Repository ist dafür zuständig, die Daten zu besorgen, wenn ein Aufrufer sie haben möchte.

namespace Config;
class Repository {
  private $database = null;

  public GetDatabaseConfig() {
    if ($this->database == null) {
      $this->database = new Config\Database();
      // hier müssen die Daten aus der Konfigurationsdatenquelle
      // irgendwie den Weg in das Objekt finden.
    }
    return $this->database;
  }
}

Und an anderer Stelle in deinem Programm, da wo du eine Datenbank-Instanz erstellen möchtest, muss es eine Instanz des Config-Repository geben, aus dem du deine Daten bekommst, die der Konstruktor benötigt.

$database = new Database\Mysql($configRepository->GetDatabaseConfig());

Das ist alles keine Raketenwissenschaft. Der Trick ist nur, die Dinge so einfach wie möglich zu halten, sprich: die Akteure weitestgehend frei von Wissen anderer Akteure zu halten.

dedlfix.