Meilleur choix de conception pour l'implémentation des aspects métier
Bonjour,
Je me pose une question sur la meilleure manière de mettre en place mon application côté serveur sachant que le besoin premier est d'avoir un code propre maintenable et évolutif.
Ce que j'ai pour l'instant c'est un script qui me génère mes classes que j'appelle modèle (du MVC) à partir de la base de données qui ont la structure suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
|
<?php
require_once('SingletonPDO.php');
require_once('ModelObject.php');
/*============================================
Classe ActionMO
============================================*/
class ActionMO extends ModelObject{
protected $nom_action;
protected $id_modules;
public function __construct( $nom_action,$modulesMO){
try{
$this->nom_action = $nom_action;
if (!is_null($modulesMO)){
$this->id_modules = $modulesMO->getId();
}
else{
$this->id_modules = null;
}
}
catch(Excpetion $e){
throw new Exception("La création de l'objet de type get_class($this) a échouée dûe à :".$e->getMessage());
}
}
public function getNomAction(){
return $this->nom_action;
}
public function getModules(){
return ModulesMO::charger($this->id_modules);
}
public function setNomAction( $nom_action){
try{
$temp = $this->nom_action;
$this->nom_action = $nom_action;
$this->modifier();
}
catch(Exception $e){
$this->nom_action = $temp;
throw new Exception("La modification de l'attribut par l'appel à la méthode setNomAction() a échouée dûe à :".$e->getMessage());
}
}
public function setModules( $modulesMO){
try{
$temp = $this->id_modules;
if(is_null($modulesMO)){
throw new Exception("Le paramètre \$modulesMO de type get_type($modulesMO) est null alors que la colonne dans la base est marquée comme NOT NULL");
}
else if(!($modulesMO instanceof ModulesMO) || is_null($modulesMO->getId())){
throw new Exception("Le paramètre \$modulesMO de type get_type($modulesMO) n'est pas du bon type ou n'est pas présent dans la base");
}
else {
$this->id_modules = $modulesMO->getId();
$this->modifier();
}
}
catch(Exception $e){
$this->id_modules = $temp;
throw new Exception("La modification de l'attribut par l'appel à la méthode setModules() a échouée dûe à :".$e->getMessage());
}
}
public static function charger( $id_action){
$dbh = SingletonPDO::getInstance();
$sql= 'SELECT * FROM action WHERE id_action = :id';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(':id'=>$id_action));
if ($row = $stmt->fetch()){
$actionMO = new ActionMO( $row['nom_action'],ModulesMO::charger($row['id_modules']));
$actionMO->id = $row['id_action'];
return $actionMO;
}
else {
return null;
}
}
protected function modifier(){
if (is_null($this->id)) {
throw new Exception("Cet objet de type ".get_class($this)." n'a pas encore été enregistré dans la base");
}
$dbh = SingletonPDO::getInstance();
try{
$dbh->beginTransaction();
$sql='UPDATE action SET nom_action = :nom_action, id_modules = :id_modules WHERE id_action = :id';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(':nom_action'=>$this->nom_action, ':id_modules'=>$this->id_modules, ':id'=>$this->id));
$dbh->commit();
}
catch(Exception $e) {
$dbh->rollback();
throw new Exception("La modification de l'objet de type ".get_class($this)." ayant l'id ". $this->id . " a échouée du à :<br/> " . $e->getMessage());
}
}
public static function supprimer( $id_action){
$dbh = SingletonPDO::getInstance();
try{
$dbh->beginTransaction();
if(!is_null($id_action)){
$sql = 'DELETE FROM action WHERE id_action = :id';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(':id'=>$id_action));
}
$dbh->commit();
}
catch(Exception $e) {
$dbh->rollback();
throw new Exception("La suppression de l'objet du ActionMO ayant l'id ". $id_action. " a échouée du à :<br/> " . $e->getMessage());
}
}
public function enregistrer(){
if (!is_null($this->id)) {
throw new Exception("Cet objet de type ".get_class($this)." ayant l'id ".$this->id." a déja été enregistré dans la base");
}
$dbh = SingletonPDO::getInstance();
try{
$dbh->beginTransaction();
$sql='INSERT INTO action ( nom_action, id_modules) VALUES (:nom_action, :id_modules)';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(':nom_action'=>$this->nom_action, ':id_modules'=>$this->id_modules));
$this->id = $dbh->lastInsertId();
$dbh->commit();
}
catch(Exception $e) {
$dbh->rollback();
throw new Exception("L'enregistrement de l'objet de type ".get_class($this)." a échouée du à :<br/> " . $e->getMessage());
}
}
public static function getAll(){
$objs = array();
$dbh = SingletonPDO::getInstance();
$sql = 'SELECT id_action FROM action';
$stmt = $dbh->query($sql);
while ($row = $stmt->fetch()) {
$obj = ActionMO::charger($row['id_action']);
if(!is_null($obj))
$objs[] = $obj;
}
return $objs;
}
/*fonction de jointure*/
public function getListGroupeAvoirDroit(){
if (is_null($this->id)) {
throw new Exception("Cet objet de type ".get_class($this)." n'a pas encore été enregistré dans la base");
}
$objs = array();
$dbh = SingletonPDO::getInstance();
$sql = 'SELECT id_groupe FROM avoir_droit WHERE id_action = :id';
$stmt->execute(array(':id' =>$this->id));
while ($row = $stmt->fetch()) {
$obj = GroupeMO::charger($row['id_groupe']);
if(!is_null($obj))
$objs[] = $obj;
}
return $objs;
}
/*fonction de jointure*/
public function getListModulesAvoirDroit(){
if (is_null($this->id)) {
throw new Exception("Cet objet de type ".get_class($this)." n'a pas encore été enregistré dans la base");
}
$objs = array();
$dbh = SingletonPDO::getInstance();
$sql = 'SELECT id_modules FROM avoir_droit WHERE id_action = :id';
$stmt->execute(array(':id' =>$this->id));
while ($row = $stmt->fetch()) {
$obj = ModulesMO::charger($row['id_modules']);
if(!is_null($obj))
$objs[] = $obj;
}
return $objs;
}
/*fonction de jointure*/
public function setGroupeModules( $groupeMO,$modulesMO){
try{
if (is_null($this->id)) {
throw new Exception("Cet objet de type ".get_class($this)." n'a pas encore été enregistré dans la base");
}
if(is_null($groupeMO) || !($groupeMO instanceof GroupeMO) || is_subclass_of($groupeMO, 'GroupeMO')|| is_null($groupeMO->getId())){
throw new Exception("Le paramètre \$groupeMO n'est pas du bon type ou vaut null ou n'est pas présent dans la base");
}
if(is_null($modulesMO) || !($modulesMO instanceof ModulesMO) || is_subclass_of($modulesMO, 'ModulesMO')|| is_null($modulesMO->getId())){
throw new Exception("Le paramètre \$modulesMO n'est pas du bon type ou vaut null ou n'est pas présent dans la base");
}
$dbh = SingletonPDO::getInstance();
$dbh->beginTransaction();
$sql='INSERT INTO avoir_droit ( id_groupe, id_modules, id_action) VALUES (:id_groupe, :id_modules, :id)';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(':id_groupe'=>$groupeMO->getId(), ':id_modules'=>$modulesMO->getId(), ':id' => $this->id));
$dbh->commit();
}
catch(Exception $e) {
$dbh->rollback();
throw new Exception("La liaison de l'objet de type ".get_class($this)." avec ".get_class($groupeMO).", ".get_class($modulesMO)." a échouée du à :<br/> " . $e->getMessage());
}
}
}
?> |
Ce sont tout au plus des objets qui simplifient les opérations simples en base de données.
La question que je me pose est la suivante :
Je souhaite implémenter les aspects métier des différents objets, pour cela quelle est la meilleure manière de procéder:
- spécialiser mes objets à travers l’héritage
- créer des classes à part et utiliser les classes modèle générées par délégation (solution moins élégante que la première à mon avis)
- retoucher directement mes classes modèle (solution la moins élégante à mon avis)?
J'aimerais avoir votre avis sur ce point car dans le MVC j'ai toujours eu un peu de mal a savoir ou placer les aspects metier (j'ai tendance à vouloir créer une couche supplémentaire pour faire un MMVC...).