Comment améliorer mon framework maison (sécurité, template...) ?
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 :
Code:
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(); |
Le fichier router inclus dans le contrôleur frontal :
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
| <?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';
}
} |
J'appelle un contrôleur :
Code:
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
);
}
} |
Je crée un factroy, en voici le code (je n'en comprends pas bien l'utilité...) :
Code:
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;
}
} |
Le factory appelle du code PHP (PDO) :
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
| <?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;
}
} |
Je retourne le résultat au Factory qui lui-même retourne le résultat au contrôleur.
Le tout est passé à la vue qui grâce à la méthode Extract récupère les valeurs :
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
| <!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> |
Je vous informe également que j'utilise AJAX et Jquery et que je ne passe jamais par le factory pour ces technologies :
Voici une partie du code :
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
| $(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');
}
});
}
}); |
Il y a aussi l'utilisation de l'url rewriting avec ce code :
Code:
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 |
Voilà, je voudrais donc avoir votre avis sur cette façon de travailler, sur le MVC utilisé...
Merci d'avance et bon dimanche.
bee