Bonjour à toutes et à tous,
Un collègue et moi avons adapté un Framework MVC maison utilisé dans une formation en Belgique.
Je suis persuadé que ce framework peut être très largement amélioré :
- Sécurité
- Template
- Hiérarchie des fichiers
- ...
J'aimerais avoir votre avis sur ce dernier et surtout vos conseils, vos remarques, vos améliorations... afin de l'améliorer :
Le contrôleur frontal :
Le fichier router inclus dans le contrôleur frontal :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <?php session_start(); require 'Controllers/router.php'; // Déclaration de la variabe globale racine $GLOBALS['racine'] = "projects/monprojet"; $route = new router; $route->router_requete();
J'appelle un contrôleur :
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 <?php // A NE PAS MODIFIER - FRAMEWORK require_once 'Autoloader.php'; class router { public function router_requete() { // fusion du $_GET et du $_POST $get = array_merge($_GET, $_POST); // Appel de l'autoloader Autoloader::init(); // Assignation du bon controleur $controller = isset($get['controller']) ? $get['controller'] : 'Accueil'; // Assignation de la bonne action $action = isset($get['action']) ? $get['action'] : 'afficher_accueil'; $fichier_controller = 'Controllers' . '\\' . $controller . '_controller'; try { if ($controller != 'acces') { // file_exists vérifie si un fichier ou un dossier existe if (file_exists(str_replace('\\', '/', $fichier_controller) . '.php')) { // Le fichier_controller n'existe pas => l'autoloader va être parsé $controller_obj = new $fichier_controller(); $fichier_vue = "views/" . $controller . '/' . $action . '.tpl.php'; if (file_exists($fichier_vue)) { $vue_action = $controller_obj->$action(); // Récupération des données avec clé du controller extract($vue_action); // Implémentation des infos par la vue require_once $fichier_vue; } else { self::redirect(); } } else { self::redirect(); } } else { $acces = new $fichier_controller(); $acces->$action(); } }//fin du try // Gestion des erreurs catch (Exception $e) { $error = new \Controllers\error_controller; extract($error->afficher_erreur($e->getMessage())); $message = $e; require_once ('Views/Error/afficher_erreur.tpl.php'); } } private static function redirect() { echo '<p>Erreur dans la requête</p><br/><hr/>'; $controller_obj = new \Controllers\Accueil_controller(); $vue_action = $controller_obj->afficher_accueil(); extract($vue_action); require_once 'Views/Accueil/afficher_accueil.tpl.php'; } }
Je crée un factroy, en voici le code (je n'en comprends pas bien l'utilité...) :
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 <?php namespace Controllers; use Models\Factory; class formulaire_guide_controller { public function afficher_formulaire_guide() { // Liste des guides $guide = new Factory\formulaire_guide_factory(); $guides = $guide->getGuides(); return array( 'guides' => $guides ); } }
Le factory appelle du code PHP (PDO) :
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 <?php namespace Models\Factory; use Models\PDO; class formulaire_guide_factory { public function getGuides() { $guides = new PDO\formulaire_guide_pdo(); $resultat = $guides->getGuides(); return $resultat; } }
Je retourne le résultat au Factory qui lui-même retourne le résultat au contrôleur.
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 <?php namespace Models\PDO; use Models\Datas; class formulaire_guide_pdo { public function getGuides(){ // Sélection des guides $sql_guide = "SELECT * FROM guides"; $stmt_guide = Datas\ConnexionPDO::getConnexion()->query($sql_guide); // Sélection des langues $sql_langues = "SELECT id as id_langue, langue FROM langues ORDER BY langue"; $stmt_langues = Datas\ConnexionPDO::getConnexion()->query($sql_langues); $retour = array( "guides"=>$stmt_guide->fetchAll(\PDO::FETCH_ASSOC), "langues"=>$stmt_langues->fetchAll(\PDO::FETCH_ASSOC) ); return $retour; } }
Le tout est passé à la vue qui grâce à la méthode Extract récupère les valeurs :
Je vous informe également que j'utilise AJAX et Jquery et que je ne passe jamais par le factory pour ces technologies :
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 <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title></title> <?php echo ' <script src="/'.$GLOBALS["racine"].'/Public/js/jquery-1.7.2.js"></script> <script src="/'.$GLOBALS["racine"].'/Public/js/jquery-ui.js"></script> <script src="/'.$GLOBALS["racine"].'/Public/js/formulaire_guides.js"></script> <script src="/'.$GLOBALS["racine"].'/Public/js/fonctions.js"></script> <link rel="stylesheet" href="/'.$GLOBALS["racine"].'/Public/css/ui-lightness/jquery_ui.css" />'; ?> <script> $(function() { $( "#tabs" ).tabs(); }); </script> </head> <body> <?php echo 'Bienvenue '.$_SESSION['liste_prenom'].' '.$_SESSION['liste_nom'].', vous êtes connecté en tant que '.$_SESSION['liste_rang'].'.'; ?> <br/> <div id="liens"> <ul> <?php echo ' <li><a href="/'.$GLOBALS["racine"].'/formulaire_client/afficher_formulaire_client">Gestion des clients</a></li> <li><a href="/'.$GLOBALS["racine"].'/formulaire_activite_fournisseur/afficher_formulaire_activite_fournisseur">Gestion des activités et fournisseurs</a></li> <li><a href="/'.$GLOBALS["racine"].'/formulaire_commande/afficher_formulaire_commande">Gestion des commandes</a></li>'; ?> </ul> </div> <br/> <select name="guides" id="guides"> <?php $guides_existant = $guides['guides']; echo "<option value=0>--- Ajouter un nouveau guide ---</option>"; foreach ($guides_existant as $guide) { echo "<option value='".$guide['id']."'>".$guide['nom']." ".$guide['prenom']." - ".$guide['rue'].", ".$guide['numero']." - ".$guide['cp']." ".$guide['ville']."</option>"; } ?> </select> <?php echo ' <img src="/'.$GLOBALS["racine"].'/Public/img/supprimer.png" id="supprimer_guide"/>'; ?> <br /><br /> <div id="tabs"> <ul> <li id="li_gestion_guides"><a href="#tab_gestion_guides">Gestion des guides (Ajout/modification/suppression)</a></li> </ul> <div id="tab_gestion_guides"> <form id= "form_guide" method="post"> <span>Langue(s) du guide => </span> <?php $langues = $guides['langues']; foreach ($langues as $langue) { echo $langue['langue'].'<input type="checkbox" name="langue_'.$langue['id_langue'].'" value="'.$langue['id_langue'].'">'; } ?> </select><br/> Numéro nationals <input type="text" name="numero_national" id="numero_national" /><br/> TVA <input type="text" name="tva" id="tva" /><br/> Nom <input type="text" name="nom" id="nom" /><br/> Prenom <input type="text" name="prenom" id="prenom" /><br/> Adresse <input type="text" size="80" name="rue" id="rue" /> n° <input type="text" size="5" name="numero" id="numero" /> Boîte <input type="text" size="5" name="boite" id="boite" /><br/> Code postal <input type="text" name="cp" id="cp" /> Ville <input type="text" name="ville" id="ville" /><br/> TEL <input type="text" name="telephone" id="telephone" /><br/> GSM <input type="text" name="gsm" id="gsm" /><br/> FAX <input type="text" name="fax" id="fax" /><br/> <br/> <input type="button" id="insert_update" name="insert_update" value="Ajouter" /> </form> </div> </div> </body> </html>
Voici une partie du code :
Il y a aussi l'utilisation de l'url rewriting avec ce code :
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 $(document).ready(function() { // Vider le formulaire au chargement de la page vider_form("form_guide"); $("#guides").val(0); // Masquer la croix $("#supprimer_guide").hide(); //Vider ou remplir le formulaire en fontion du choix dans la liste déroulante $("#guides").change(function() { //si on choisit la première valeur de la ld if ($(this).val() === "0") { // On masque la croix si ce n'est déjà fait $("#supprimer_guide").hide(); vider_form("form_guide"); //on modifie le nom du bouton $("#insert_update").val("Ajouter"); } else { // On affiche la croix $("#supprimer_guide").show(); // 1) Sélectionner toutes les informations du guide -> AJAJ :) guide_id = $(this).val(); $.ajax( { url : "../Models/PDO/gestion_guides/onglet_guides.php", type : 'POST', data : { "guide_id" : guide_id, "action":'Remplir' }, dataType : 'json', success : function (retour) { console.log(retour); // 2) On lance les fonctions définies plus bas remplir_form(retour["guide"],"form_guide"); cocher_case(retour["langue"]); // 3) On modifie la value du submit $("#insert_update").val("Modifier"); }, error: function() { alert ('Erreur dans la requête'); } }); } });
Voilà, je voudrais donc avoir votre avis sur cette façon de travailler, sur le MVC utilisé...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 # PROJET A MODIFIER - FRAMEWORK RewriteEngine on # Le $1 correspond aux paramètres RewriteRule ^([a-zA-Z_0-9]+)/([a-zA-Z_0-9]+)$ /projects/BB/index.php?controller=$1&action=$2
Merci d'avance et bon dimanche.
bee
Partager