Skip to content

15. Anwendungsaufgabe – Version 7

Image

15.1. Implementierung

Wir greifen hier auf Version 6 zurück und lagern die in den Hauptskripten verwendeten Konstanten in eine Konfigurationsdatei aus. Die Konfigurationsdatei ist die Datei jSON mit folgendem Inhalt:


{
    "rootDirectory": "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07",
    "databaseFilename": "Data/database.json",
    "taxAdminDataFileName": "Data/taxadmindata.json",
    "taxPayersDataFileName": "Data/taxpayersdata.json",
    "resultsFileName": "Data/results.json",
    "errorsFileName": "Data/errors.json",
    "dependencies": {
        "BaseEntity": "/../version-05/Entities/BaseEntity.php",
        "TaxAdminData": "/../version-05/Entities/TaxAdminData.php",
        "TaxPayerData": "/../version-05/Entities/TaxPayerData.php",
        "Database": "/../version-05/Entities/Database.php",
        "ExceptionImpots": "/../version-05/Entities/ExceptionImpots.php",
        "Utilitaires": "/../version-05/Utilities/Utilitaires.php",
        "InterfaceDao": "/../version-05/Dao/InterfaceDao.php",
        "TraitDao": "/../version-05/Dao/TraitDao.php",
        "InterfaceDao4TransferAdminData2Database": "/../version-05/Dao/InterfaceDao4TransferAdminData2Database.php",
        "DaoTransferAdminDataFromJsonFile2Database": "/../version-05/Dao/DaoTransferAdminDataFromJsonFile2Database.php",        
        "DaoImpotsWithTaxAdminDataInDatabase": "/../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php",
        "InterfaceMetier": "/../version-05/Métier/InterfaceMetier.php",
        "Metier": "/../version-05/Métier/Metier.php"
    },
    "dependencies4calculate": [
        "BaseEntity",
        "TaxAdminData",
        "TaxPayerData",
        "Database",
        "ExceptionImpots",
        "Utilitaires",
        "InterfaceDao",
        "TraitDao",
        "DaoImpotsWithTaxAdminDataInDatabase",
        "InterfaceMetier",
        "Metier"],
    "dependencies4transfer": [
        "BaseEntity",
        "TaxAdminData",
        "Database",
        "ExceptionImpots",
        "Utilitaires",
        "InterfaceDao",
        "TraitDao",  
        "InterfaceDao4TransferAdminData2Database",
        "DaoTransferAdminDataFromJsonFile2Database"]
}

In dieser Konfiguration:

  • Zeile 2: den Ordner, von dem aus alle Pfade in dieser Konfigurationsdatei gemessen werden;
  • Zeilen 3–7: die Pfade aller jSON-Dateien der Anwendung;
  • Zeilen 8–22: die Pfade aller Dateien der Anwendung im Format [clé=>chemin];
  • Zeilen 23–34: die Abhängigkeiten für die Steuerberechnung in Form einer Liste von Schlüsseln aus dem Wörterbuch [dependencies] (Zeilen 8–22);
  • Zeilen 35–44: die Abhängigkeiten für die Übertragung der Dateien jSON und [taxadmindata.json] in die Datenbank in Form einer Liste von Schlüsseln aus dem Wörterbuch [dependencies] (Zeilen 8–22);

Das Skript zur Übertragung der Daten der Steuerverwaltung [MainTransferAdminDataFromFile2PostgresSQLDatabase.php] lautet nun wie folgt:


<?php

// Strikte Einhaltung der deklarierten Typen der Funktionsparameter
declare (strict_types=1);

// Namensraum
namespace Application;

// Fehlerbehandlung durch PHP
// ini_set("display_errors", "0");
//
// Pfad zur Konfigurationsdatei
define("CONFIG_FILENAME", "../Data/config.json");

// Die Konfiguration wird abgerufen
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);

// die für das Skript erforderlichen Abhängigkeiten werden eingebunden
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4transfer"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}

// Definition der Konstanten
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
define("TAXADMINDATA_FILENAME", "$rootDirectory/{$config["taxAdminDataFileName"]}");

//
try {
  // Erstellung der Ebene [dao]
  $dao = new DaoTransferAdminDataFromJsonFile2Database(DATABASE_CONFIG_FILENAME, TAXADMINDATA_FILENAME);
  // Übertragung der Daten in die Datenbank
  $dao->transferAdminData2Database();
} catch (ExceptionImpots $ex) {
  // Der Fehler wird angezeigt
  print $ex->getMessage() . "\n";
}
// Ende
print "Terminé\n";
exit;

Anmerkungen

Der Code bleibt derselbe wie im Abschnitt „Link“. Der einzige Unterschied besteht darin, dass anstelle der Konstanten in den Zeilen 18–26 die Datei [config.json] verwendet wird;

  • Zeile 16: Die Funktion [file_get_contents] wandelt die Datei [config.json] in eine Zeichenkette um. Die Funktion [json_decode] verwendet diese Zeichenkette anschließend, um das Wörterbuch [$config] zu erstellen. Der zweite Parameter [true] der Funktion [json_decode] gibt an, dass ein Wörterbuch erstellt werden soll;
  • Zeilen 19–22: Hier werden die erforderlichen Abhängigkeiten für das Skript zur Datenübertragung aus der Datei [taxadmindata.json] in die Datenbank eingebunden;
    • [$config["dependencies4transfer"]] ist das Array der für das Übertragungsskript erforderlichen Abhängigkeiten. Es handelt sich um eine Liste von Schlüsseln. Die Pfade der in das Projekt einzubindenden Dateien befinden sich im Wörterbuch [$config["dependencies"]];
    • $config["rootDirectory"] stellt den Pfad dar, mit dem die einzubindenden Dateien vorangestellt werden müssen;

Ebenso lautet das Skript zur Steuerberechnung nun wie folgt: [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase]:


<?php

// Strikte Einhaltung der deklarierten Typen der Funktionsparameter
declare (strict_types=1);

// Namensraum
namespace Application;

// Fehlerbehandlung durch PHP
// ini_set("display_errors", "0");
//
// Pfad zur Konfigurationsdatei
define("CONFIG_FILENAME", "../Data/config.json");

// Die Konfiguration wird abgerufen
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);

// die für das Skript erforderlichen Abhängigkeiten werden eingebunden
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}

// Definition der Konstanten
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
define("TAXPAYERSDATA_FILENAME", "$rootDirectory/{$config["taxPayersDataFileName"]}");
define("RESULTS_FILENAME", "$rootDirectory/{$config["resultsFileName"]}");
define("ERRORS_FILENAME", "$rootDirectory/{$config["errorsFileName"]}");

//
try {
  // Erstellung der Ebene [dao]
  $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
  // Erstellung der Ebene [métier]
  $métier = new Metier($dao);
  // Steuerberechnung im Batch-Modus
  $métier->executeBatchImpots(TAXPAYERSDATA_FILENAME, RESULTS_FILENAME, ERRORS_FILENAME);
} catch (ExceptionImpots $ex) {
  // Fehler wird angezeigt
  print "Une erreur s'est produite : " . utf8_encode($ex->getMessage()) . "\n";
}
// Ende
print "Terminé\n";
exit;

15.2. Tests [Codeception]

Diese Version wird wie die vorherigen durch Tests mit dem Namen [Codeception] validiert.

Image

15.2.1. Test der Schicht [dao]

Der Test [DaoTest.php] lautet wie folgt:


<?php

// Strikte Einhaltung der deklarierten Typen der Funktionsparameter
declare (strict_types=1);

// Namensraum
namespace Application;

// Definition von Konstanten
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// Pfad zur Konfigurationsdatei
define("CONFIG_FILENAME", ROOT."/Data/config.json");
// Die Konfiguration wird abgerufen
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// Einbinden der für das Skript erforderlichen Abhängigkeiten
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}
// weitere Konstanten
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");

// Test -----------------------------------------------------

class DaoTest extends \Codeception\Test\Unit {
  // TaxAdminData
  private $taxAdminData;

  public function __construct() {
    parent::__construct();
    // Erstellung der Ebene [dao]
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    $this->taxAdminData = $dao->getTaxAdminData();
  }

  // Tests
  public function testTaxAdminData() {

  }

}

Kommentare

  • Zeilen 9–21: Definition der Testumgebung. Wir verwenden dieselbe Umgebung wie im Hauptskript [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase], das im Abschnitt „Link“ beschrieben ist, jedoch ohne die Schicht [métier];
  • Zeilen 29–34: Aufbau der Ebene [dao];
  • Zeile 33: Das Attribut [$this→taxAdminData] enthält die zu testenden Daten;
  • Zeilen 37–39: Die Methode [testTaxAdminData] ist die im Abschnitt „Link“ beschriebene;

Die Testergebnisse lauten wie folgt:

Image

15.2.2. Test der Ebene [métier]

Der Test [MetierTest.php] lautet wie folgt:


<?php

// Strikte Einhaltung der deklarierten Typen der Funktionsparameter
declare (strict_types=1);

// Namensraum
namespace Application;

// Definition von Konstanten
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// Pfad zur Konfigurationsdatei
define("CONFIG_FILENAME", ROOT . "/Data/config.json");
// Die Konfiguration wird abgerufen
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// Einbinden der für das Skript erforderlichen Abhängigkeiten
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}
// weitere Konstanten
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");

// Testklasse
class MetierTest extends \Codeception\Test\Unit {
  // Geschäftslogikschicht
  private $métier;

  public function __construct() {
    parent::__construct();
    // Erstellung der Schicht [dao]
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    // Erstellung der Schicht [métier]
    $this->métier = new Metier($dao);
  }

  // Tests
  public function test1() {

  }

  -----------------------------------

  public function test11() {

  }

}

Anmerkungen

  • Zeilen 9–21: Definition der Testumgebung. Wir verwenden dieselbe wie im Hauptskript [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase], das im Abschnitt „Link“ beschrieben ist;
  • Zeilen 28–34: Aufbau der Schicht [dao];
  • Zeile 33: Das Attribut [$this→métier] ist eine Referenz auf die zu testende Schicht [métier];
  • Zeilen 37–45: Die Methoden [test1, test2…, test11] sind die im Abschnitt „Link“ beschriebenen;

Die Testergebnisse lauten wie folgt:

Image