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 : Sélectionner tout - Visualiser dans une fenêtre à part
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...).