Skip to content
Gérits Aurélien edited this page Feb 13, 2026 · 3 revisions

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

Liste des méthodes principales

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.

Usage de base

  1. 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
]);
  1. 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();
}

Transactions et Sécurité

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.";
}

Utilisation avancée : Transactions et Variables SQL (@)

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.

Typage Automatique

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

Configuration & Drivers

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.

Configuration des accès

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.

Clone this wiki locally