-
Notifications
You must be signed in to change notification settings - Fork 0
Layer
La classe Layer est l'interface principale d'accès aux bases de données. Elle encapsule la complexité de PDO pour offrir des méthodes simplifiées d'insertion, de mise à jour et de récupération de données. Elle gère nativement les transactions, le typage automatique des paramètres et l'archivage des erreurs de requêtes via le Logger.
Namespace : Magepattern\Component\Database\Layer
| Méthode | Paramètres | Retour | Description |
|---|---|---|---|
| getInstance() | - | self | Accès au Singleton. |
| fetchAll() | $sql, $params, $opt | array|false | Récupère tous les résultats d'une requête. |
| fetch() | $sql, $params, $opt | array|false | Récupère une seule ligne. |
| insert() | $sql, $params | bool | Exécute une insertion. |
| update() | $sql, $params | bool | Exécute une mise à jour. |
| delete() | $sql, $params | bool | Exécute une suppression. |
| transaction() | array $queries | array|false | Exécute un lot de requêtes de manière atomique. |
| lastInsertId() | - | string|false | Récupère l'ID généré par la dernière insertion. |
- Sélection de données (Lecture) Le typage des paramètres (String, Int, Bool) est géré automatiquement en interne.
use Magepattern\Component\Database\Layer;
$db = Layer::getInstance();
$sql = "SELECT * FROM users WHERE status = :status AND level > :level";
$users = $db->fetchAll($sql, [
'status' => 'active',
'level' => 2
]);- Insertion de données (Écriture)
$sql = "INSERT INTO logs (message, created_at) VALUES (:msg, :date)";
$success = $db->insert($sql, [
'msg' => 'Nouvelle connexion',
'date' => date('Y-m-d H:i:s')
]);
if ($success) {
echo "Log enregistré avec l'ID : " . $db->lastInsertId();
}Utilisation des Transactions Idéal pour les opérations critiques où toutes les requêtes doivent réussir ou toutes échouer (ex: transfert bancaire, création de commande).
$queries = [
['request' => "UPDATE accounts SET balance = balance - 10 WHERE id = 1"],
['request' => "UPDATE accounts SET balance = balance + 10 WHERE id = 2"]
];
$result = $db->transaction($queries);
if ($result === false) {
// Le rollback a été géré automatiquement par le Layer
echo "Erreur lors de la transaction.";
}Le Layer permet d'utiliser des variables utilisateur MySQL (préfixées par @) pour transmettre des données entre les requêtes d'une même transaction sans repasser par PHP. Cela garantit une performance optimale et une intégrité totale des données.
Exemple : Création d'une commande et de son historique Dans ce scénario, nous créons une commande et utilisons immédiatement son ID pour insérer une entrée dans une table liée.
use Magepattern\Component\Database\Layer;
$db = Layer::getInstance();
$queries = [
// 1. Insertion de la commande principale
[
'request' => "INSERT INTO orders (user_id, amount) VALUES (:uid, :amount)",
'params' => ['uid' => 123, 'amount' => 89.99]
],
// 2. Stockage de l'ID généré dans une variable MySQL @last_id
[
'request' => "SET @last_id = LAST_INSERT_ID()",
'params' => []
],
// 3. Utilisation de @last_id pour l'insertion dans l'historique
[
'request' => "INSERT INTO orders_history (order_id, action) VALUES (@last_id, :action)",
'params' => ['action' => 'order_created']
]
];
// Le Layer exécute tout le bloc. Si une étape échoue, rien n'est enregistré.
$result = $db->transaction($queries);
if ($result !== false) {
echo "Commande enregistrée avec succès.";
}Avantages de cette approche Performance : Réduit les allers-retours entre le serveur PHP et le serveur MySQL.
Sécurité : Les variables préfixées par @ sont liées à la session de connexion actuelle ; elles ne peuvent pas être lues ou modifiées par un autre utilisateur.
Fiabilité : En cas d'échec de la troisième requête, la variable @last_id et l'insertion de la commande (étape 1) sont annulées grâce au rollBack() automatique du Layer.
Le Layer inspecte chaque valeur passée dans le tableau $execute pour définir le flag \PDO::PARAM_* approprié :
- Integer -> PDO::PARAM_INT
- Boolean -> PDO::PARAM_BOOL
- Null -> PDO::PARAM_NULL
- Autres -> PDO::PARAM_STR
La classe détecte les constantes globales ou utilise des valeurs par défaut :
Driver par défaut : Défini par MP_DBDRIVER (MySQL par défaut).
Debug : En activant l'option debugParams => true, vous pouvez déclencher un debugDumpParams() sur votre statement pour inspecter la requête réelle.
Pour que le Layer puisse établir la connexion, vous devez définir les constantes globales de configuration, généralement dans votre fichier config.php ou au sommet de votre bootstrap.php.
// Configuration de la base de données
define('MP_DBHOST', 'localhost'); // Serveur de base de données
define('MP_DBNAME', 'my_database'); // Nom de la base
define('MP_DBUSER', 'root'); // Utilisateur
define('MP_DBPASSWORD', 'root'); // Mot de passe
define('MP_DBDRIVER', 'mysql'); // Driver (mysql, mariadb, pgsql, sqlite)Note : Si ces constantes ne sont pas définies, le Layer utilisera les valeurs par défaut (localhost, mysql, etc.) mais la connexion échouera probablement sans les identifiants corrects.