Routage et exceptions

This commit is contained in:
moinal 2020-12-16 18:06:53 +01:00 committed by GitHub
parent 6c89f92be2
commit bdcdd70c36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 111 additions and 23 deletions

View File

@ -5,9 +5,15 @@ final class ControleurHelloworld
public function defautAction() public function defautAction()
{ {
$O_helloworld = new Helloworld(); $O_helloworld = new Helloworld();
Vue::montrer('helloworld/voir', array('helloworld' => $O_helloworld->donneMessage())); Vue::montrer('helloworld/voir', array('helloworld' => $O_helloworld->donneMessage()));
} }
public function testformAction(Array $A_parametres = null, Array $A_postParams = null)
{
Vue::montrer('helloworld/testform', array('formData' => $A_postParams));
}
} }

View File

@ -10,6 +10,13 @@ final class ChargementAuto
return static::_charger($S_fichier); return static::_charger($S_fichier);
} }
public static function chargerClassesException ($S_nomDeClasse)
{
$S_fichier = Constantes::repertoireExceptions() . "$S_nomDeClasse.php";
return static::_charger($S_fichier);
}
public static function chargerClassesModele ($S_nomDeClasse) public static function chargerClassesModele ($S_nomDeClasse)
{ {
$S_fichier = Constantes::repertoireModele() . "$S_nomDeClasse.php"; $S_fichier = Constantes::repertoireModele() . "$S_nomDeClasse.php";
@ -42,6 +49,7 @@ final class ChargementAuto
// J'empile tout ce beau monde comme j'ai toujours appris à le faire... // J'empile tout ce beau monde comme j'ai toujours appris à le faire...
spl_autoload_register('ChargementAuto::chargerClassesNoyau'); spl_autoload_register('ChargementAuto::chargerClassesNoyau');
spl_autoload_register('ChargementAuto::chargerClassesException');
spl_autoload_register('ChargementAuto::chargerClassesModele'); spl_autoload_register('ChargementAuto::chargerClassesModele');
spl_autoload_register('ChargementAuto::chargerClassesVue'); spl_autoload_register('ChargementAuto::chargerClassesVue');
spl_autoload_register('ChargementAuto::chargerClassesControleur'); spl_autoload_register('ChargementAuto::chargerClassesControleur');

View File

@ -13,6 +13,8 @@ final class Constantes
const REPERTOIRE_NOYAU = '/Noyau/'; const REPERTOIRE_NOYAU = '/Noyau/';
const REPERTOIRE_EXCEPTIONS = '/Noyau/Exceptions/';
const REPERTOIRE_CONTROLEURS = '/Controleurs/'; const REPERTOIRE_CONTROLEURS = '/Controleurs/';
@ -24,6 +26,10 @@ final class Constantes
return self::repertoireRacine() . self::REPERTOIRE_NOYAU; return self::repertoireRacine() . self::REPERTOIRE_NOYAU;
} }
public static function repertoireExceptions() {
return self::repertoireRacine() . self::REPERTOIRE_EXCEPTIONS;
}
public static function repertoireVues() { public static function repertoireVues() {
return self::repertoireRacine() . self::REPERTOIRE_VUES; return self::repertoireRacine() . self::REPERTOIRE_VUES;
} }

View File

@ -4,32 +4,69 @@ final class Controleur
{ {
private $_A_urlDecortique; private $_A_urlDecortique;
public function __construct ($S_controleur, $S_action) private $_A_urlParametres;
{
if (empty($S_controleur)) { private $_A_postParams;
// Nous avons pris le parti de préfixer tous les controleurs par "Controleur"
$this->_A_urlDecortique['controleur'] = 'ControleurDefaut'; public function __construct ($S_url, $A_postParams)
} else { {
$this->_A_urlDecortique['controleur'] = 'Controleur' . ucfirst($S_controleur); // On élimine l'éventuel slash en fin d'URL sinon notre explode renverra une dernière entrée vide
if ('/' == substr($S_url, -1, 1)) {
$S_url = substr($S_url, 0, strlen($S_url) - 1);
} }
if (empty($S_action)) { // On éclate l'URL, elle va prendre place dans un tableau
$A_urlDecortique = explode('/', $S_url);
if (empty($A_urlDecortique[0])) {
// Nous avons pris le parti de préfixer tous les controleurs par "Controleur"
$A_urlDecortique[0] = 'ControleurDefaut';
} else {
$A_urlDecortique[0] = 'Controleur' . ucfirst($A_urlDecortique[0]);
}
if (empty($A_urlDecortique[1])) {
// L'action est vide ! On la valorise par défaut // L'action est vide ! On la valorise par défaut
$this->_A_urlDecortique['action'] = 'defautAction'; $A_urlDecortique[1] = 'defautAction';
} else { } else {
// On part du principe que toutes nos actions sont suffixées par 'Action'...à nous de le rajouter // On part du principe que toutes nos actions sont suffixées par 'Action'...à nous de le rajouter
$this->_A_urlDecortique['action'] = $S_action . 'Action'; $A_urlDecortique[1] = $A_urlDecortique[1] . 'Action';
} }
// on dépile 2 fois de suite depuis le début, c'est à dire qu'on enlève de notre tableau le contrôleur et l'action
// il ne reste donc que les éventuels parametres (si nous en avons)...
$this->_A_urlDecortique['controleur'] = array_shift($A_urlDecortique); // on recupere le contrôleur
$this->_A_urlDecortique['action'] = array_shift($A_urlDecortique); // puis l'action
// ...on stocke ces éventuels parametres dans la variable d'instance qui leur est réservée
$this->_A_urlParametres = $A_urlDecortique;
// On s'occupe du tableau $A_postParams
$this->_A_postParams = $A_postParams;
} }
// On exécute // On exécute notre triplet
public function executer() public function executer()
{ {
//fonction de rappel de notre controleur cible (ControleurHelloworld pour notre premier exemple) if (!class_exists($this->_A_urlDecortique['controleur'])) {
call_user_func_array(array(new $this->_A_urlDecortique['controleur'], throw new ControleurException($this->_A_urlDecortique['controleur'] . " n'est pas un controleur valide.");
$this->_A_urlDecortique['action']), array()); }
if (!method_exists($this->_A_urlDecortique['controleur'], $this->_A_urlDecortique['action'])) {
throw new ControleurException($this->_A_urlDecortique['action'] . " du contrôleur " .
$this->_A_urlDecortique['controleur'] . " n'est pas une action valide.");
}
$B_called = call_user_func_array(array(new $this->_A_urlDecortique['controleur'],
$this->_A_urlDecortique['action']), array($this->_A_urlParametres, $this->_A_postParams ));
if (false === $B_called) {
throw new ControleurException("L'action " . $this->_A_urlDecortique['action'] .
" du contrôleur " . $this->_A_urlDecortique['controleur'] . " a rencontré une erreur.");
}
} }
} }

View File

@ -0,0 +1,3 @@
<?php
class ControleurException extends Exception {}

View File

@ -0,0 +1,8 @@
<?php
// Tout cela à des fin de test uniquement
echo var_dump($A_vue['formData']);
echo '<form action="" method="post">';
echo '<input type="text" name="test" id="test">';
echo '<input type="submit" value="tester">';
echo '</form>';

View File

@ -5,14 +5,34 @@
/* /*
url pour notre premier test MVC Hello World, url pour notre premier test MVC Hello World,
nous n'avons pas d'action précisée on visera celle par défaut nous n'avons pas d'action précisée on visera celle par défaut
index.php?ctrl=helloworld /index.php?ctrl=helloworld
/helloworld
/controleur/nom_action/whatever/whatever2/
*/ */
/*
$S_controleur = isset($_GET['ctrl']) ? $_GET['ctrl'] : null; $S_controleur = isset($_GET['ctrl']) ? $_GET['ctrl'] : null;
$S_action = isset($_GET['action']) ? $_GET['action'] : null; $S_action = isset($_GET['action']) ? $_GET['action'] : null;
Vue::ouvrirTampon(); // /Noyau/Vue.php : on ouvre le tampon d'affichage, les contrôleurs qui appellent des vues les mettront dedans Vue::ouvrirTampon(); // /Noyau/Vue.php : on ouvre le tampon d'affichage, les contrôleurs qui appellent des vues les mettront dedans
$O_controleur = new Controleur($S_controleur, $S_action); $O_controleur = new Controleur($S_controleur, $S_action);
$O_controleur->executer(); */
$S_urlADecortiquer = isset($_GET['url']) ? $_GET['url'] : null;
$A_postParams = isset($_POST) ? $_POST : null;
Vue::ouvrirTampon(); // on ouvre le tampon d'affichage, les contrôleurs qui appellent des vues les mettront dedans
try
{
$O_controleur = new Controleur($S_urlADecortiquer, $A_postParams);
$O_controleur->executer();
}
catch (ControleurException $O_exception)
{
echo ('Une erreur s\'est produite : ' . $O_exception->getMessage());
}
// Les différentes sous-vues ont été "crachées" dans le tampon d'affichage, on les récupère // Les différentes sous-vues ont été "crachées" dans le tampon d'affichage, on les récupère
$contenuPourAffichage = Vue::recupererContenuTampon(); $contenuPourAffichage = Vue::recupererContenuTampon();