mmt - data access layer
In de datalaag worden de gegevens opgehaald uit en opgeslagen in de database. De DAL maakt ze klaar om doorgegeven te worden aan de logische laag.
Data Access Layer
We hebben de code van Tania Rascia gerefactored en in klassen ondergebracht. Voor elke entiteit hebben we een aparte DAL klasse gemaakt. Tijd om nog een stap verder te gaan. Als je die DAL klassen voor Fric-frac goed bekijkt kan je ze nog refactoren. De code voor al die verschillende DAL's is bijna identiek op enkele parameters na. Ik denk aan de tabelnaam, de kolomnaam waarop je zoekt, de kolomnamen die je in de SELECT plaatst enz.
Na een beetje puzzelwerk ben ik erin geslaagd een generieke DAL klasse te maken voor om het even welke entiteit. We gaan het resultaat van nabij bekijken.
- Vermits we een generieke DAL klasse hebben gemaakt hoort die niet meer thuis in de mmt-php-api map maar in de modernways map waar het helpers.php bestand al staat. We maken het bestand met de naam /mmt-php-api/vendor/modernways/src/Dal.php.
- De DAL klasse heeft de naam
Dal
en staat in de\ModernWays
namespace:<?php namespace ModernWays; class Dal { // methods to access the MySQL database }
- We declareren drie variabelen:
/** * @var $connection The main connection to the database * @var $configLocation path to config file * @var $message feedback for the user of this class */ protected static $connection; public static $configLocation = "config.ini"; protected static $message;
- De
$message
kan alleen door een methode van de klasse ingesteld worden. We voegen een getter toe om de message voor externe klassen toegankelijk te maken:public static function getMessage() { return self::$message; }
- De helper methode
cleanup
verwijdert alle ongewenste tekens uit de input waarden en gebruikt daarvoor deescape
methode van deHelpers
klasse:/** ------------------ cleanup -------------------------- * * Escapes scripts tags from input * * @lastmodified 26/01/2019 * @author Jef Inghelbrecht - Entreprise de Modes et de Manieres Modernes - e3M * @version 1.0 * @param $postArray with the values to be cleaned up * @return array */ protected static function cleanup($postArray) { $cleanPostArray = array(); foreach ($postArray as $key => $value) { $cleanPostArray[$key] = \ModernWays\Helpers::escape($value); } return $cleanPostArray; }
- De
columnsCommaSeparated
methode converteert de elementen van een array naar een string waarbij de elementen van de array door een komma gescheiden worden. Deze elementen zijn kolomnamen van de tabel en worden dus ook 'ontvlucht' (escaped) door ze tussen backticks te plaatsen. We gebruiken die methode om o.a. de SELECT waarden samen te stellen:/** ------------------ columnsCommaSeparated -------------------------- * * We cannot use explode to cancatenate the items of an array in een comma * separated string because the items must be enclosed between backticks * * @lastmodified 26/01/2019 * @author Jef Inghelbrecht - Entreprise de Modes et de Manieres Modernes - e3M * @version 1.0 * @param $columnSelectArray array with items to be concatenated * @return string */ private static function columnsCommaSeparated($columnSelectArray) { $columns = ''; if (isset($columnSelectArray)) { foreach($columnSelectArray as $item) { $columns .= "`{$item}`, "; } } else { $columns = '*'; } $columns = rtrim($columns, ", "); return $columns; }
- De
connect
methode probeert een verbinding met de MySQL database te maken- Code staat in het bestand met de naam /mmt-php-api/vendor/modernways/src/Dal.php:
public static function connect($connectionName='local') { $success = false; $options = array( \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION && \PDO::ERRMODE_WARNING ); if (self::$connection !== null) { self::$message = 'Connectie is al gemaakt.'; $success = true; } else { // true want we willen secties inlezen // met dank aan Sam Wouters voor het idee om // een ini bestand te gebruiken!!!!! $config = parse_ini_file(self::$configLocation, true); try { $database = $config[$connectionName]['database']; $userName = $config[$connectionName]['username']; $password = $config[$connectionName]['password']; $driver = $config[$connectionName]['driver']; $host = $config[$connectionName]['host']; $port = $config[$connectionName]['port']; $dsn = "{$driver}:host={$host}:{$port};dbname={$database}"; self::$connection = new \PDO($dsn, $userName, $password, $options); self::$message = "Connectie met $database is gemaakt."; $success = true; } catch (\PDOException $e) { self::$message = $e->getMessage(); } } return $success; }
- Gebruik: Let erop dat je de juiste locatie van het config.ini bestand hebt ingesteld vooraleer die methode te gebruiken. Bijvoorbeeld in het test bestand met de naam /mmt-php-api/vendor/modernways/mmt/src/test/curiosityDal.php:
\ModernWays\Dal::$configLocation = __DIR__ . '/../../../../../data/config.ini'; if (\ModernWays\Dal::Connect('local')) { echo 'We zijn gelukkig, want het is gelukt.'; } else { echo 'We hebben het gekopieerd van Jef maar toch werkt het niet :('; }; echo \ModernWays\Dal::getMessage();
- Code staat in het bestand met de naam /mmt-php-api/vendor/modernways/src/Dal.php:
- De
create
method voegt een of meerdere rijen in de tabel toe.- Code staat in bestand met de naam /mmt-php-api/vendor/modernways/src/Dal.php:
/** ------------------ create -------------------------- * * Update one or multiple rows in a table * * @lastmodified 27/01/2019 * @author Jef Inghelbrecht - Entreprise de Modes et de Manieres Modernes - e3M * @version 1.0 * @param $tableName table name * @param $postArray the values used to insert one row in table is $postArray is an associative array, * if it is an array with more than one associative array in it, multiple rows are inserted. * @param $columnForMessage the columnname to be used ihe feedback for the user * @return int the number of inserted rows in the table */ public static function create($tableName, $postArray, $columnForMessage='Name') { $success = 0; if (self::connect()) { // if $postArray is one row, thus an associative array if (\ModernWays\Helpers::isAssoc($postArray)) { $rows = [$postArray]; } else { $rows = $postArray; } foreach ($rows as $item) { $row = self::cleanUp($item); echo '<pre>'; var_dump($row); echo '</pre>'; try { // we kunnen hier niet implode gebruiken omdat de kolommen // 'ontsnapt' moeten worden en tussen backticks geplaatst moeten worden. $columns = self::columnsCommaSeparated(array_keys($row)); $sql = sprintf("INSERT INTO %s (%s) VALUES (:%s)", $tableName, $columns, implode(', :', array_keys($row))); echo $sql; $statement = self::$connection->prepare($sql); $success = $statement->execute($row); if ($success == 0) { self::$message = "{$row[$columnForMessage]} in tabel {$tableName} is niet toegevoegd."; } else { self::$message = "{$row[$columnForMessage]} in tabel {$tableName} is toegevoegd."; } } catch (\PDOException $exception) { self::$message = "Rij is niet toegevoegd in {$tableName}!<br .>"; self::$message .= $exception->getMessage(); } } } return $success; }
- Gebruik 1 staat in het bestand met de naam /mmt-php-api/vendor/modernways/mmt/src/test/curiosityDal.php:
$newCuriosity = array ( "Name" => "Allée couverte du Colombier", "Image" => "Allee couverte du Colombier.jpg", "Comment" => "", "Type" => "allée couverte", "Period" => "Neolithicum", "Coordinates" => "47° 42′ 25″ nord, 0° 14′ 49″ est", "Longitude" => "0.24694444444444444", "Latitude" => "47.7069444", "Country" => "Frankrijk", "Region" => "Pays de la Loire", "Province" => "Sarthe", "City" => "Aubigné-Racan"); \ModernWays\Dal::$configLocation = __DIR__ . '/../../../../../data/config.ini'; if (\ModernWays\Dal::create('Curiosity', $newCuriosity, 'Name')) { echo 'Create is gelukt!'; } else { echo 'Oeps er is iets fout gelopen!'; } echo \ModernWays\Dal::getMessage();
- Gebruik 2 staat in hetzelfde bestand en leest het oorspronkelijke json bestand in en voegt rijen toe in de tabel
Curiosity
:// Moe Maar Tevreden Setup: fill Curiosity from JSON \ModernWays\Dal::$configLocation = __DIR__ . '/../../../../../data/config.ini'; $list = json_decode(file_get_contents(__DIR__ . '/../../../../../data/neolithicum.json'), true); $curiosityList = $list['Curiosity']; foreach ($curiosityList as $item) { //Remove the "Id" element, which has the index "Id". // Om te inserten hebben we geen Id nodig unset($item['Id']); // print_r($item); \ModernWays\Dal::create('Curiosity', $item); echo \ModernWays\Dal::getMessage() . '<br />'; }
- Gebruik 3 leest eerst 1 rij in de
Role
tabel en dan drie in een keer. De code staat in /mmt-php-api/vendor/modernways/mmt/src/test/roleDal.php:<?php include ('../../../../autoload.php'); \ModernWays\Dal::$configLocation = __DIR__ . '/../../../../../data/config.ini'; /* Create */ // first insert one row $row = array ("Name" => "GUEST"); if (\ModernWays\Dal::create('Role', $row, 'Name')) { echo 'Create is gelukt!<br />'; } else { echo 'Oeps er is iets fout gelopen! <br />'; } echo \ModernWays\Dal::getMessage(); // then the other three at one time $rows = array (array("Name" => "USER"), ["Name" => "SUPERUSER"], ["Name" => "DIRECTOR"]); echo '<pre>'; var_dump($rows); echo '</pre>'; if (\ModernWays\Dal::create('Role', $rows, 'Name')) { echo 'Create is gelukt!<br />'; } else { echo 'Oeps er is iets fout gelopen! <br />'; } echo \ModernWays\Dal::getMessage();
- Gebruik 4 voegt twee gebruikers toe:
<?php include ('../../../../autoload.php'); \ModernWays\Dal::$configLocation = __DIR__ . '/../../../../../data/config.ini'; /* Create */ // then the other three at one time $rows = array ( ["Name" => "Mo", "HashedPassword" => password_hash('Modern_Waysf5Yu6èH,kk', PASSWORD_DEFAULT), 'RoleId' => '1', 'Salt' => 'f5Yu6èH,kk'], ["Name" => "Jef", "HashedPassword" => password_hash('Modern_WaysvB&z@fg,jj', PASSWORD_DEFAULT), 'RoleId' => '2', 'Salt' => 'vB&z@fg,jj'] ); if (\ModernWays\Dal::create('User', $rows, 'Name')) { echo 'Create is gelukt!<br />'; } else { echo 'Oeps er is iets fout gelopen! <br />'; } echo \ModernWays\Dal::getMessage();
- Code staat in bestand met de naam /mmt-php-api/vendor/modernways/src/Dal.php:
- De
delete
methode waarmee je een rij uit de tabel kan deleted:- Code staat in bestand met de naam /mmt-php-api/vendor/modernways/src/Dal.php:
/** ------------------ delete -------------------------- * * Deletes one row in a table * * @lastmodified 26/01/2019 * @author Jef Inghelbrecht - Entreprise de Modes et de Manieres Modernes - e3M * @version 1.0 * @param $tableName table name * @param $value the value to be looked up in the WHERE clause * @param $columnName the columnname to be looked up in the WHERE clause; default is the Id column * @return boolean if row is deleted return true otherwise false */ public static function delete($tableName, $value, $columnName = 'Id') { $success = 0; if (self::connect()) { try { $sql = "DELETE FROM $tableName WHERE $columnName = :$columnName"; $statement = self::$connection->prepare($sql); $statement->bindParam(":$columnName", $value); $statement->execute(); $success = $statement->rowCount(); if ($success == 0) { self::$message = "De rij met $columnName $value is niet verwijderd uit $tableName!"; } else { self::$message = "De rij met $columnName $value is verwijderd uit $tableName!"; } } catch (\PDOException $exception) { self::$message = "Fout: de rij met $columnName = $value is niet verwijderd uit $tableName!<br />{$exception->getMessage()}"; } } return $success; }
- Gebruik staat in het bestand met de naam /mmt-php-api/vendor/modernways/mmt/src/test/curiosityDal.php. In het volgende voorbeeld wordt de rij waarvan de
Id
gelijk is aan 1 uit de tabelCuriosity
verwijderd. Vermits we niet expliciet de kolomnaam als derde argument meegegeven wordt standaard deId
kolom ingesteld:\ModernWays\Dal::$configLocation = __DIR__ . '/../../../../../data/config.ini'; $row = \ModernWays\Dal::delete('Curiosity', '1'); echo \ModernWays\Dal::getMessage();
- Code staat in bestand met de naam /mmt-php-api/vendor/modernways/src/Dal.php:
- Met de
readAllWhere
methode haal je alle rijen op die aan een bepaalde voorwaarde voldoen. Je kan de kolomnaam en de waarde ervoor als argument meegeven. Standaard is de kolomnaamId
. Je kan ook een ORDER BY clausule als argument opgeven. Standaard is dat deName
kolomnaam:- Code staat in bestand met de naam /mmt-php-api/vendor/modernways/src/Dal.php:
/** ------------------ readAllWhere -------------------------- * * Reads all rows from a table according to a where clause * PDO::FETCH_ASSOC removes all the numeric keys and only leaves with associated keys. * * @lastmodified 27/01/2019 * @author Jef Inghelbrecht - Entreprise de Modes et de Manieres Modernes - e3M * @version 1.0 * @param $tableName table name * @param $value the value to be looked up in the WHERE clause * @param $columnName the columnname to be looked up in the WHERE clause; default is the Id column * @param $columnSelectArray array with columnnames to be selected from the table. Default is all (*). * @return array selected rows from the table, colum as key-value pairs */ public static function readAllWhere($tableName, $value, $columnName = 'Id', $orderBy = 'Name', $columnSelectArray = null) { $result = null; if (self::connect()) { try { $columns = self::columnsCommaSeparated($columnSelectArray); $sql = "SELECT {$columns} FROM {$tableName} WHERE {$columnName} = {$value} ORDER BY $orderBy"; $statement = self::$connection->prepare($sql); $statement->execute(); $result = $statement->fetchAll(\PDO::FETCH_ASSOC); self::$message = "Alle rijen van $tableName zijn ingelezen."; } catch (\PDOException $exception) { self::$message = $exception->getMessage(); self::$message = "De tabel $tableName is leeg."; } } return $result; }
- Gebruik zie mmt - service layer.
- Code staat in bestand met de naam /mmt-php-api/vendor/modernways/src/Dal.php:
2019-01-27 17:15:32