MVC Hello World

This commit is contained in:
moinal 2020-12-03 19:48:58 +01:00 committed by GitHub
parent c3bc6cc2d0
commit 9dd72d1361
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 213 additions and 0 deletions

View File

@ -0,0 +1,13 @@
<?php
final class ControleurHelloworld
{
public function defautAction()
{
$S_helloworld = new Helloworld();
Vue::montrer('helloworld/voir', array('helloworld' => $S_helloworld->donneMessage()));
}
}

12
Modele/Helloworld.php Normal file
View File

@ -0,0 +1,12 @@
<?php
final class Helloworld
{
private $_S_message = "Hello World";
public function donneMessage()
{
return $this->_S_message ;
}
}

47
Noyau/ChargementAuto.php Normal file
View File

@ -0,0 +1,47 @@
<?php
require 'Noyau/Constantes.php';
final class ChargementAuto
{
public static function chargerClassesNoyau ($S_nomDeClasse)
{
$S_fichier = Constantes::repertoireNoyau() . "$S_nomDeClasse.php";
return static::_charger($S_fichier);
}
public static function chargerClassesModele ($S_nomDeClasse)
{
$S_fichier = Constantes::repertoireModele() . "$S_nomDeClasse.php";
return static::_charger($S_fichier);
}
public static function chargerClassesVue ($S_nomDeClasse)
{
$S_fichier = Constantes::repertoireVues() . "$S_nomDeClasse.php";
return static::_charger($S_fichier);
}
public static function chargerClassesControleur ($S_nomDeClasse)
{
$S_fichier = Constantes::repertoireControleurs() . "$S_nomDeClasse.php";
return static::_charger($S_fichier);
}
private static function _charger ($S_fichierACharger)
{
if (is_readable($S_fichierACharger))
{
require $S_fichierACharger;
}
}
}
// J'empile tout ce beau monde comme j'ai toujours appris à le faire...
spl_autoload_register('ChargementAuto::chargerClassesNoyau');
spl_autoload_register('ChargementAuto::chargerClassesModele');
spl_autoload_register('ChargementAuto::chargerClassesVue');
spl_autoload_register('ChargementAuto::chargerClassesControleur');

40
Noyau/Constantes.php Normal file
View File

@ -0,0 +1,40 @@
<?php
// Rappel : nous sommes dans le répertoire Core, voilà pourquoi dans realpath je "remonte d'un cran" pour faire référence
// à la VRAIE racine de mon application
final class Constantes
{
// Les constantes relatives aux chemins
const REPERTOIRE_VUES = '/Vues/';
const REPERTOIRE_MODELE = '/Modele/';
const REPERTOIRE_NOYAU = '/Noyau/';
const REPERTOIRE_CONTROLEURS = '/Controleurs/';
public static function repertoireRacine() {
return realpath(__DIR__ . '/../');
}
public static function repertoireNoyau() {
return self::repertoireRacine() . self::REPERTOIRE_NOYAU;
}
public static function repertoireVues() {
return self::repertoireRacine() . self::REPERTOIRE_VUES;
}
public static function repertoireModele() {
return self::repertoireRacine() . self::REPERTOIRE_MODELE;
}
public static function repertoireControleurs() {
return self::repertoireRacine() . self::REPERTOIRE_CONTROLEURS;
}
}

35
Noyau/Controleur.php Normal file
View File

@ -0,0 +1,35 @@
<?php
final class Controleur
{
private $_A_urlDecortique;
public function __construct ($S_controleur, $S_action)
{
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);
}
if (empty($S_action)) {
// L'action est vide ! On la valorise par défaut
$this->_A_urlDecortique['action'] = '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';
}
}
// 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());
}
}

27
Noyau/Vue.php Normal file
View File

@ -0,0 +1,27 @@
<?php
final class Vue
{
public static function ouvrirTampon()
{
// On démarre le tampon de sortie, on va l'appeler "tampon principal"
ob_start();
}
public static function recupererContenuTampon()
{
// On retourne le contenu du tampon principal
return ob_get_clean();
}
public static function montrer ($S_localisation, $A_parametres = array())
{
$S_fichier = Constantes::repertoireVues() . $S_localisation . '.php';
$A_vue = $A_parametres;
// Démarrage d'un sous-tampon
ob_start();
include $S_fichier; // c'est dans ce fichier que sera utilisé A_vue, la vue est inclue dans le sous-tampon
ob_end_flush();
}
}

12
Vues/gabarit.php Normal file
View File

@ -0,0 +1,12 @@
<!doctype html>
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>My sweet MVC</title>
</head>
<body>
<?php Vue::montrer('standard/entete'); ?>
<?php echo $A_vue['body'] ?>
<?php Vue::montrer('standard/pied'); ?>
</body>
</html>

3
Vues/helloworld/voir.php Normal file
View File

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

2
Vues/standard/entete.php Normal file
View File

@ -0,0 +1,2 @@
<?php
echo '<header> <h1>Titre</h1></header>';

1
Vues/standard/pied.php Normal file
View File

@ -0,0 +1 @@
<footer>Pied</footer>

21
index.php Normal file
View File

@ -0,0 +1,21 @@
<?php
// Ce fichier est le point d'entrée de votre application
require 'Noyau/ChargementAuto.php';
/*
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
*/
$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();
// Les différentes sous-vues ont été "crachées" dans le tampon d'affichage, on les récupère
$contenuPourAffichage = Vue::recupererContenuTampon();
// On affiche le contenu dans la partie body du gabarit général
Vue::montrer('gabarit', array('body' => $contenuPourAffichage));