Skip to content

15. Esercizio pratico – Versione 7

Image

15.1. Implementazione

Qui, rivedremo la versione 6 spostando le costanti utilizzate negli script principali in un file di configurazione. Il file di configurazione sarà un file JSON con il seguente contenuto:


{
    "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 questa configurazione:

  • riga 2: la directory da cui vengono misurati tutti i percorsi in questo file di configurazione;
  • righe 3–7: i percorsi di tutti i file JSON nell'applicazione;
  • righe 8–22: i percorsi di tutti i file dell'applicazione, nella forma [chiave=>percorso];
  • righe 23–34: le dipendenze per il calcolo delle imposte nella forma di un elenco di chiavi dal dizionario [dipendenze] (righe 8–22);
  • righe 35–44: dipendenze per il trasferimento del file JSON [taxadmindata.json] al database sotto forma di un elenco di chiavi dal dizionario [dipendenze] (righe 8–22);

Lo script per il trasferimento dei dati amministrativi fiscali al database [MainTransferAdminDataFromFile2PostgresSQLDatabase.php] diventa il seguente:


<?php
 
// strict adherence to declared types of function parameters
declare (strict_types=1);
 
// namespace
namespace Application;
 
// error handling by PHP
// ini_set("display_errors", "0");
//
// configuration file path
define("CONFIG_FILENAME", "../Data/config.json");
 
// we retrieve the configuration
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
 
// include the necessary script dependencies
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4transfer"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}
 
// definition of constants
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
define("TAXADMINDATA_FILENAME", "$rootDirectory/{$config["taxAdminDataFileName"]}");
 
//
try {
  // creation of the [dao] layer
  $dao = new DaoTransferAdminDataFromJsonFile2Database(DATABASE_CONFIG_FILENAME, TAXADMINDATA_FILENAME);
  // data transfer to the database
  $dao->transferAdminData2Database();
} catch (ExceptionImpots $ex) {
  // error is displayed
  print $ex->getMessage() . "\n";
}
// end
print "Terminé\n";
exit;

Commenti

Il codice rimane lo stesso della sezione collegata. L'unica differenza è l'uso del file [config.json] al posto delle costanti alle righe 18–26;

  • riga 16: la funzione [file_get_contents] trasferisce il file [config.json] in una stringa. La funzione [json_decode] utilizza quindi questa stringa per costruire il dizionario [$config]. Il secondo parametro [true] della funzione [json_decode] indica che vogliamo costruire un dizionario;
  • righe 19–22: includiamo le dipendenze necessarie allo script per trasferire i dati dal file [taxadmindata.json] al database;
    • [$config["dependencies4transfer"]] è l'array delle dipendenze richieste dallo script di trasferimento. Si tratta di un elenco di chiavi. I percorsi dei file da includere nel progetto si trovano nel dizionario [$config["dependencies"]];
    • $config["rootDirectory"] rappresenta il percorso con cui devono essere prefissati i file da includere;

Analogamente, lo script di calcolo delle imposte diventa il seguente [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase]:


<?php
 
// strict adherence to declared types of function parameters
declare (strict_types=1);
 
// namespace
namespace Application;
 
// error handling by PHP
// ini_set("display_errors", "0");
//
// configuration file path
define("CONFIG_FILENAME", "../Data/config.json");
 
// we retrieve the configuration
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
 
// include the necessary script dependencies
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}
 
// definition of constants
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 {
  // creation of the [dao] layer
  $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
  // creation of the [business] layer
  $métier = new Metier($dao);
  // tax calculation in batch mode
  $métier->executeBatchImpots(TAXPAYERSDATA_FILENAME, RESULTS_FILENAME, ERRORS_FILENAME);
} catch (ExceptionImpots $ex) {
  // error is displayed
  print "Une erreur s'est produite : " . utf8_encode($ex->getMessage()) . "\n";
}
// end
print "Terminé\n";
exit;

15.2. Test [Codeception]

Questa versione, come le precedenti, è convalidata dai test [Codeception].

Image

15.2.1. Test del livello [DAO]

Il test [DaoTest.php] è il seguente:


<?php
 
// strict adherence to declared function parameter types
declare (strict_types=1);
 
// namespace
namespace Application;
 
// defining constants
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// configuration file path
define("CONFIG_FILENAME", ROOT."/Data/config.json");
// we retrieve the configuration
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// include the necessary script dependencies
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}
// other constants
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
 
// test -----------------------------------------------------
 
class DaoTest extends \Codeception\Test\Unit {
  // TaxAdminData
  private $taxAdminData;
 
  public function __construct() {
    parent::__construct();
    // creation of the [dao] layer
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    $this->taxAdminData = $dao->getTaxAdminData();
  }
 
  // tests
  public function testTaxAdminData() {

  }
 
}

Commenti

  • righe 9–21: definizione dell'ambiente di test. Utilizziamo lo stesso ambiente, senza il livello [business], di quello utilizzato dallo script principale [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] descritto nella sezione collegata;
  • righe 29–34: creazione del livello [dao];
  • riga 33: l'attributo [$this→taxAdminData] contiene i dati da testare;
  • Righe 37–39: il metodo [testTaxAdminData] è quello descritto nella sezione collegata;

I risultati del test sono i seguenti:

Image

15.2.2. Test del livello [Business]

Il test [MetierTest.php] è il seguente:


<?php
 
// strict adherence to declared types of function parameters
declare (strict_types=1);
 
// namespace
namespace Application;
 
// defining constants
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// configuration file path
define("CONFIG_FILENAME", ROOT . "/Data/config.json");
// we retrieve the configuration
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// include the necessary script dependencies
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}
// other constants
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
 
// test class
class MetierTest extends \Codeception\Test\Unit {
  // business layer
  private $métier;
 
  public function __construct() {
    parent::__construct();
    // creation of the [dao] layer
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    // creation of the [business] layer
    $this->métier = new Metier($dao);
  }
 
  // tests
  public function test1() {

  }
 
  -----------------------------------
 
  public function test11() {

  }
 
}

Commenti

  • righe 9–21: definizione dell'ambiente di test. Utilizziamo lo stesso dello script principale [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] descritto nella sezione collegata;
  • righe 28–34: costruzione del livello [dao];
  • riga 33: l'attributo [$this→business] è un riferimento al livello [business] da testare;
  • righe 37–45: i metodi [test1, test2…, test11] sono quelli descritti nella sezione collegata;

I risultati del test sono i seguenti:

Image