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()
{
$O_helloworld = new Helloworld();
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);
}
public static function chargerClassesException ($S_nomDeClasse)
{
$S_fichier = Constantes::repertoireExceptions() . "$S_nomDeClasse.php";
return static::_charger($S_fichier);
}
public static function chargerClassesModele ($S_nomDeClasse)
{
$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...
spl_autoload_register('ChargementAuto::chargerClassesNoyau');
spl_autoload_register('ChargementAuto::chargerClassesException');
spl_autoload_register('ChargementAuto::chargerClassesModele');
spl_autoload_register('ChargementAuto::chargerClassesVue');
spl_autoload_register('ChargementAuto::chargerClassesControleur');

View File

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

View File

@ -4,32 +4,69 @@ final class Controleur
{
private $_A_urlDecortique;
public function __construct ($S_controleur, $S_action)
{
private $_A_urlParametres;
if (empty($S_controleur)) {
// Nous avons pris le parti de préfixer tous les controleurs par "Controleur"
$this->_A_urlDecortique['controleur'] = 'ControleurDefaut';
} else {
$this->_A_urlDecortique['controleur'] = 'Controleur' . ucfirst($S_controleur);
private $_A_postParams;
public function __construct ($S_url, $A_postParams)
{
// 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
$this->_A_urlDecortique['action'] = 'defautAction';
$A_urlDecortique[1] = 'defautAction';
} else {
// 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 exécute
public function executer()
{
//fonction de rappel de notre controleur cible (ControleurHelloworld pour notre premier exemple)
call_user_func_array(array(new $this->_A_urlDecortique['controleur'],
$this->_A_urlDecortique['action']), array());
// 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 notre triplet
public function executer()
{
if (!class_exists($this->_A_urlDecortique['controleur'])) {
throw new ControleurException($this->_A_urlDecortique['controleur'] . " n'est pas un controleur valide.");
}
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

@ -1,3 +1,3 @@
<?php
echo "<p>" . $A_vue['helloworld'] . "</p>";
echo "<p>" . $A_vue['helloworld'] . "</p>";

View File

@ -5,14 +5,34 @@
/*
url pour notre premier test MVC Hello World,
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_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
$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
$contenuPourAffichage = Vue::recupererContenuTampon();