191 lines
5.2 KiB
PHP
191 lines
5.2 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace manager;
|
||
|
|
||
|
|
||
|
class Dispatcher{
|
||
|
|
||
|
// Constantes (a dispatcher dans un .conf)
|
||
|
public static $supported_extensions = array('svg');
|
||
|
public static $supported_extensions_header = array('image/svg+xml');
|
||
|
public static $supported_parents = array('st', 'dy');
|
||
|
public static $supported_parents_folder = array('/src/static', '/src/dynamic');
|
||
|
|
||
|
// Attributs prives utiles (initialisation)
|
||
|
private $header;
|
||
|
private $path;
|
||
|
private $flags;
|
||
|
|
||
|
|
||
|
/* CONSTRUCTEUR & AMORCAGE DU DISPATCHER
|
||
|
*
|
||
|
* @url<String> L'url courante
|
||
|
*
|
||
|
* @GET<Array> Arguments indirects (variable $_GET)
|
||
|
*
|
||
|
* @return status<Boolean> Retourne si oui ou non tout s'est bien passe
|
||
|
*
|
||
|
*/
|
||
|
public function __construct($url){
|
||
|
/* [1] On recupere les donnees de l'URL
|
||
|
==================================================*/
|
||
|
$serialFlags = array_slice( explode('/',$url), 1 );
|
||
|
|
||
|
/* [2] On check/cree les drapeaux avec ces donnees
|
||
|
==================================================*/
|
||
|
if( !$this->createFlags($serialFlags) ) // Creation des drapeaux
|
||
|
return false; // On retourne FALSE, si erreur
|
||
|
|
||
|
|
||
|
/* [3] On construit le chemin a partir des tags
|
||
|
==================================================*/
|
||
|
if( !$this->buildPath() ) // Construction du chemin
|
||
|
return false; // On retourne FALSE, si erreur
|
||
|
|
||
|
/* [4] On gere l'affichage pour l'appel externe
|
||
|
==================================================*/
|
||
|
$this->view();
|
||
|
|
||
|
|
||
|
|
||
|
return true;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/* FONCTION QUI VERIFIE LES DRAPEAUX
|
||
|
*
|
||
|
* @serialFlags<Array> Tableau a indice numerique
|
||
|
*
|
||
|
* @return correct<Boolean> Retourne si oui ou non les drapeaux sont corrects
|
||
|
*
|
||
|
*/
|
||
|
private function createFlags($serialFlags){
|
||
|
/* [1] Verification des flags (version serialisee)
|
||
|
======================================================*/
|
||
|
|
||
|
$correct = true;
|
||
|
|
||
|
// Verification du nombre de drapeaux () au moins 3
|
||
|
$correct = $correct && count($serialFlags) >= 3;
|
||
|
|
||
|
// Verification que l'extension est correcte
|
||
|
$correct = $correct && array_search($serialFlags[0], self::$supported_extensions) !== false;
|
||
|
|
||
|
// Verification du filename
|
||
|
$correct = $correct && preg_match('#^[\w_-]+$#i', $serialFlags[1]);
|
||
|
|
||
|
// Verification du parent
|
||
|
$correct = $correct && array_search($serialFlags[2], self::$supported_parents) !== false;
|
||
|
|
||
|
// Verification du sous-parent (optionnel)
|
||
|
$opt_subParent = count($serialFlags) >= 4;
|
||
|
|
||
|
if( $opt_subParent )
|
||
|
$correct = $correct && preg_match('#^[\w_-]+$#i', $serialFlags[3]);
|
||
|
|
||
|
|
||
|
if( !$correct )
|
||
|
return false;
|
||
|
|
||
|
|
||
|
|
||
|
/* [2] Creation (non serialisee) des flags
|
||
|
======================================================*/
|
||
|
// Si tout se deroule bien, on cree les flags
|
||
|
$this->flags = array(
|
||
|
'extension' => $serialFlags[0],
|
||
|
'filename' => $serialFlags[1],
|
||
|
'parent' => $serialFlags[2]
|
||
|
);
|
||
|
|
||
|
// Ajout du sous-parent optionnel
|
||
|
if( $opt_subParent )
|
||
|
$this->flags['subparent'] = $serialFlags[3];
|
||
|
|
||
|
return true;
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/* FONCTION QUI CONSTRUIT LE CHEMIN A PARTIR DU PATH
|
||
|
*
|
||
|
* @return fileExists<Boolean> Retourne si oui ou non le fichier cible existe
|
||
|
*
|
||
|
* @format
|
||
|
*
|
||
|
* f/extension/filename/parent/:subparent:/ (:OPT:)
|
||
|
*
|
||
|
*/
|
||
|
private function buildPath(){
|
||
|
/* [1] On recupere le HEADER associe a l'extension
|
||
|
==========================================================*/
|
||
|
$index_header = array_search($this->flags['extension'], self::$supported_extensions);
|
||
|
|
||
|
// Si l'extension n'est pas repertoriee, on retourne une erreur
|
||
|
if( $index_header === false ) return false;
|
||
|
|
||
|
// Si aucun header pour cet indice, on retourne une erreur
|
||
|
if( !isset(self::$supported_extensions_header[$index_header]) ) return false;
|
||
|
|
||
|
// On recupere le header associe
|
||
|
$header = self::$supported_extensions_header[$index_header];
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/* [2] On recupere le chemin associe au parent
|
||
|
==========================================================*/
|
||
|
$index_parent = array_search($this->flags['parent'], self::$supported_parents);
|
||
|
|
||
|
// Si le parent n'est pas repertorie, on retourne une erreur
|
||
|
if( $index_parent === false ) return false;
|
||
|
|
||
|
// Si aucun dossier pour cet indice, on retourne une erreur
|
||
|
if( !isset(self::$supported_parents_folder[$index_parent]) ) return false;
|
||
|
|
||
|
// On recupere le dossier associe
|
||
|
$parent = self::$supported_parents_folder[$index_parent];
|
||
|
|
||
|
|
||
|
/* [3] Gestion du sous-parent optionnel
|
||
|
==========================================================*/
|
||
|
$opt_subParent = (isset($this->flags['subparent'])) ? $this->flags['subparent'].'/' : '';
|
||
|
|
||
|
|
||
|
/* [4] On definit le header
|
||
|
==========================================================*/
|
||
|
$this->header = $header;
|
||
|
|
||
|
/* [5] On construit le chemin
|
||
|
==========================================================*/
|
||
|
$this->path = __ROOT__.$parent.'/'.$opt_subParent.$this->flags['filename'].'.'.$this->flags['extension'];
|
||
|
|
||
|
/* [6] On retourne si le fichier existe ou non
|
||
|
==========================================================*/
|
||
|
return file_exists( $this->path );
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/* FUNCTION QUI AFFICHE LA RESSOURCE EN QUESTION
|
||
|
*
|
||
|
*/
|
||
|
public function view(){
|
||
|
// On definit le header
|
||
|
header('Content-Type: '.$this->header);
|
||
|
|
||
|
// On inclut le contenu
|
||
|
include $this->path;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
?>
|