Easy-Micro

LANGAGE POO PHP Part 1
Manager

La programmation orientée objet en PHP : Le manager

Les fonctionnalités d'un manager

Un objet gérant des entités issues d'une BDD est généralement appelé un "manager". Comme un manager ne fonctionne pas sans support de stockage (dans notre cas, une BDD), on va prendre un exemple concret en créant un gestionnaire pour nos personnages, qui va donc se charger d'en ajouter, d'en modifier, d'en supprimer et d'en récupérer.

Pour pouvoir gérer au mieux des entités présentes en BDD (ici, nos personnages), il va falloir quelques fonctionnalités de base. Quelles sont-elles ? Un manager doit pouvoir :
  • enregistrer une nouvelle entité;
  • modifier une entité;
  • supprimer une entité;
  • sélectionner une entité.
C'est le fameux CRUD (Create, Read, Update, Delete)

<?php
class PersonnagesManager {
  private $_db; // Instance de PDO.

  public function __construct($db) {
    $this->setDb($db);
  }

  public function add(Personnage $perso) {
    // Préparation de la requête d'insertion.
    // Assignation des valeurs pour le nom, la force, les dégâts, l'expérience et le niveau du personnage.
    // Exécution de la requête.
  }

  public function delete(Personnage $perso) {
    // Exécute une requête de type DELETE.
  }

  public function get($id) {
    // Exécute une requête de type SELECT avec une clause WHERE, et retourne un objet Personnage.
  }

  public function getList() {
    // Retourne la liste de tous les personnages.
  }

  public function update(Personnage $perso) {
    // Prépare une requête de type UPDATE.
    // Assignation des valeurs à la requête.
    // Exécution de la requête.
  }

  public function setDb(PDO $db) {
    $this->_db = $db;
  }
}

<?php
class PersonnagesManager {
  private $_db; // Instance de PDO

  public function __construct($db) {
    $this->setDb($db);
  }

  public function add(Personnage $perso) {
    $q = $this->_db->prepare('INSERT INTO personnages(nom, forcePerso, degats, niveau, experience) VALUES(:nom, :forcePerso, :degats, :niveau, :experience)');

    $q->bindValue(':nom', $perso->nom());
    $q->bindValue(':forcePerso', $perso->forcePerso(), PDO::PARAM_INT);
    $q->bindValue(':degats', $perso->degats(), PDO::PARAM_INT);
    $q->bindValue(':niveau', $perso->niveau(), PDO::PARAM_INT);
    $q->bindValue(':experience', $perso->experience(), PDO::PARAM_INT);

    $q->execute();
  }

  public function delete(Personnage $perso) {
    $this->_db->exec('DELETE FROM personnages WHERE id = '.$perso->id());
  }

  public function get($id) {
    $id = (int) $id;

    $q = $this->_db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages WHERE id = '.$id);
    $donnees = $q->fetch(PDO::FETCH_ASSOC);

    return new Personnage($donnees);
  }

  public function getList() {
    $persos = [];

    $q = $this->_db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages ORDER BY nom');

    while ($donnees = $q->fetch(PDO::FETCH_ASSOC)) {
      $persos[] = new Personnage($donnees);
    }

    return $persos;
  }

  public function update(Personnage $perso) {
    $q = $this->_db->prepare('UPDATE personnages SET forcePerso = :forcePerso, degats = :degats, niveau = :niveau, experience = :experience WHERE id = :id');

    $q->bindValue(':forcePerso', $perso->forcePerso(), PDO::PARAM_INT);
    $q->bindValue(':degats', $perso->degats(), PDO::PARAM_INT);
    $q->bindValue(':niveau', $perso->niveau(), PDO::PARAM_INT);
    $q->bindValue(':experience', $perso->experience(), PDO::PARAM_INT);
    $q->bindValue(':id', $perso->id(), PDO::PARAM_INT);

    $q->execute();
  }

  public function setDb(PDO $db) {
    $this->_db = $db;
  }
}

Essayons tout ça !

<?php
// // créé un objet personnage
$perso = new Personnage([
  'nom' => 'Victor',
  'forcePerso' => 5,
  'degats' => 0,
  'niveau' => 1,
  'experience' => 0
]);

$db = new PDO('mysql:host=localhost;dbname=tests', 'root', '');
$manager = new PersonnagesManager($db); 
    
$manager->add($perso); // ajoute ce personnage en BDD

Flux RSS Easy-Micro - Abonnez-vous Easy-Micro [ François Bisch ]