nous parlons bien d’une requête http ?un contrôleur est une classe dont le rôle est de gérer une requête et d'envoyer une réponse
Donc le code suivant effectue le bon travail ?Ce qu'on appelle contrôleur frontal est le contrôleur qui reçoit la requête, qui la route et qui renvoie la réponse.
if (!isset($_GET['module']) || empty($_GET['module'])) {
$module = new Module(1);
}
elseif (isset($_GET['module'])) {
$connex = new Connex();
$_GET['module'] = (int) $_GET['module'];
$critere = array($_GET['module']);
// on cherche si un id existe
$requete = "SELECT id_module FROM modules WHERE id_module = ?";
$nbModule = $connex->compte($critere, $requete);
$nb = $nbModule;
if ($nb === 1) {
// on crée l'objet du module demander
$module = new Module($_GET['module']);
}
else {
$module = new Module(1);
}
}
else {
$module = new Module(1);
}
Pour ce qui est de l'ordre des étapes, il me semble être sur la bonne route mais pour l'image, je ne peut pas trop te dire, il faut que j'en comprenne plus que ça0. envoi de la requête par le client
1. réception de la requête par le serveur sur le fichier index.php (souvent via réécriture d'URL)
2. instanciation du framework et appelle du router
3. routing de la requête sur un contrôleur (dispatch)
4. exécution de la logique métier (appelle à la BDD, traitements, etc)
5. instanciation d'une vue à laquelle le contrôleur passe les données issues de la logique métier
6. création de la réponse via la vue
7. envoi de la réponse au client
8. réception de la réponse par le client
if(isset($_GET['module']) && !empty($_GET['module'])) {
$connex = new Connex();
$_GET['module'] = (int) $_GET['module'];
$critere = array($_GET['module']);
// on cherche si un id existe
$requete = "SELECT id_module FROM modules WHERE id_module = ?";
$nbModule = $connex->compte($critere, $requete);
$nb = $nbModule;
if ($nb === 1) {
// on crée l'objet du module demander
$module = new Module($_GET['module']);
}
else {
$module = new Module(1);
}
}
else {
$module = new Module(1);
}
require 'FrontController.php';
$frontController = new FrontController(new Request());
$response = $frontController -> response();
echo $response -> display();
Fichier Frontcontroller.php :
<?php
class Frontcontroller {
private $response;
public function __construct(Request $request) {
$router = new Router($request);
$this -> response = $router -> dispatch();
}
Fichier Router.php :
class Router {
public function __construct(Request $request) {
$this -> request = $request;
}
public function dispatch() {
// instancie et appelle le contrôleur, il existe d'autre technique voir le design patterns Factory
$controllerName = $this-> getController();
$actionName = $this-> getAction();
$controller = new $controllerName();
return $controller -> $action($this -> request);
}
}<?php
/* * ***************************************************************************
* Initialisation de la page avec $_GET['page']
* ************************************************************************** */
if (!isset($_GET['page']) || empty($_GET['page'])) {
/* si $_GET n'existe pas ou est vide */
$fichier = 'accueil';
$nom_page = 'accueil';
$vue = 'modules/' . $module->nomModule() . '/vues/accueil.php';
} elseif (isset($_GET['page']) && (!empty($_GET['page']))) {
/**
* Si $_GET existe et qu'il n'est pas vide: inclusion de routeur.php
* il contient toutes les routes des fichiers présents dans son module
*/
include 'modules/' . $module->nomModule() . '/controler/routeur.php';
} else {
/* Si rien ne correspond, je dirige vers module site page accueil */
$fichier = 'accueil';
$nom_page = 'accueil';
$vue = 'modules/' . $module->nomModule() . 'vues/accueil.php';
}
/* création de l'objet page */
$page = new Page($fichier);
?>
qui inclu ( include 'modules/' . $module->nomModule() . '/controler/routeur.php'; ) si $_GEt['page'] est comme il le doit:<?php
if ($_GET['page'] == 'accueil'
OR $_GET['page'] == 'presentation'
OR $_GET['page'] == 'liste-blog') {
$fichier = $_GET['page'];
$nom_page = $_GET['page'];
$vue = 'modules/' . $module->nomModule() . '/vues/' . $fichier . '.php';
} else {
$fichier = 'accueil';
$nom_page = 'accueil';
$vue = 'modules/' . $module->nomModule() . '/vues/' . $fichier . '.php';
}
?> 'modules/' . $module->nomModule() . '/config/routes.xml';
Ici je mets du XML, mais rien n'empêche de mettre du INI, YAML ou du PHP.Et voici des exemples d'actions pour que ce soit plus parlant :[module]
/module1
[controllers]
/controller1/action1 : Controller1Controller->action1
/controller1/action2 : Controller1Controller->action2
/controller2/action : Controller1Controller2->action
[module]
/blog
[controllers]
/articles : ArticlesController->lister
/articles/ajouter : ArticlesController->ajouter
/articles/[id]/commentaires : CommentairesController->listerParArticle
oui, c'est bien ça et c’était ma question suivante, comment simplifier le routeur ?Si je comprends bien ton code, chaque module a son propre routeur.
$module = new $module();
$module->{$action}();
$module->renderView();class article extends module {
public function liste() {
// le code de la page
}
public function detail() {
// le code de la page
}
}
Le routage et l'appel de l'action du contrôleur (en simplifié sans les tests) :
$module = new $_GET['module']();
$module->{$_GET['page']}();
Ensuite il faut que tu ajoutes un système de transfert des variables entre l'action et la vue pour en faire le rendu.la soif d'apprendre, je n'i ai d'utilité prévu mais comme je veux apprendre, que j'ai le temps et que je sais ce que je veux dans un cms a l'origine fait pour les intégrateurs, je tente de le faire... et si j'y arrive, je dis bien "SI" alors je l'utiliserais...Et au fait tu fais ça dans quel cadre ? c'est un sujet d'études ?