- [x] Gestion des erreurs

- [x] Explicitation
- [ ] Conception du systeme de delegation des managers
	- [x] Module Request
		- [x] Inline (en php)
		- [x] Serialise (en json <String>)
		- [x] Par url (POST)
This commit is contained in:
xdrm-brackets 2016-02-04 23:45:03 +01:00
parent b1b9d60d15
commit 2b9fc4c080
13 changed files with 359 additions and 24 deletions

4
automate.php Normal file → Executable file
View File

@ -99,10 +99,10 @@
function displayUsers(){
// Creation de la requete
$requete = new manager\ModuleRequest('firstModule/getUsers');
$requete = new \manager\ModuleRequest('firstModule/getUsers');
$users = $requete->dispatch();
var_dump($users);
return true;

0
config/jsongenerator_users.js Normal file → Executable file
View File

View File

@ -1,4 +1,8 @@
{
"userDefaultModule" :[
"getAll"
],
"firstModule" : [
"getUsers",
"returnvar",

View File

@ -1,12 +1,11 @@
<?php define('__ROOT__', dirname(__FILE__) );
require_once __ROOT__.'/manager/autoloader.php';
/*******************************************/
/* DEBUGGER */
/*******************************************/
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
debug();
/*******************************************/
@ -45,14 +44,25 @@
// Dispatcher
$R->get('f(?:/([\w-]+))*/?', function(){ new \manager\ResourceDispatcher($_GET['url']); });
// Api
$R->post('api/?', function(){
$request = \manager\ModuleRequest::fromURL($_POST);
// Si requete correcte
if( $request->error == \manager\ManagerError::Success )
var_dump( $request->dispatch() );
else
echo 'request error';
});
// N'importe -> page d'accueil
$R->get('.+', function(){ header('Location: /dashboard/'); });
$R->post('.*', function(){
var_dump( 'Acces POST : '.$_GET['url'] );
var_dump( $_POST );
});
// $R->post('.*', function(){
// var_dump( 'Acces POST : '.$_GET['url'] );
// var_dump( $_POST );
// });

48
manager/ManagerError.php Normal file → Executable file
View File

@ -4,42 +4,68 @@
namespace manager;
abstract class ManagerError{
class ManagerError{
/* SUCCESS */
const Success = 0;
const Success = 0;
/* Parsage json */
const ParsingFailed = 1;
const ParsingFailed = 1;
/* ResourceDispatcher */
// Drapeaux invalides
const InvalidFlags = 2;
const InvalidFlags = 2;
// Fichier inexistant
const FileNotFound = 3;
const UnreachableResource = 3;
/* ModuleRequest */
// Le @path n'est pas renseigne
const MissingPath = 4;
const MissingPath = 4;
// Le @path n'est pas du bon type
const WrongPathType = 5;
const WrongPathType = 5;
// Verification de la coherence du chemin (existe dans la conf)
const WrongPath = 6;
const WrongPath = 6;
// Module non specifie dans la conf
const UnknownModule = 7;
const UnknownModule = 7;
// Methode non specifie pour ce Module dans la conf
const UnknownMethod = 8;
const UnknownMethod = 8;
// Methode inamorcable
const UncallableMethod = 9;
const UncallableMethod = 9;
/* EXPLICITE UN CODE D'ERREUR
*
* @error<Integer> Code d'erreur
*
* @return explicit<String> Description explicite du code d'erreur
*
*/
public static function explicit($error){
switch($error){
case self::Success: return "Tout s'est bien deroule"; break;
case self::ParsingFailed: return "La lecture du fichier JSON a echoue"; break;
case self::InvalidFlags: return "Les specifications (drapeaux) sont incorrects"; break;
case self::UnreachableResource: return "La ressource n'existe pas (404)"; break;
case self::MissingPath: return "Le chemin de delegation n'a pas ete renseigne"; break;
case self::WrongPathType: return "Le chemin de delegation n'est pas du bon type (chaine de caractere)"; break;
case self::WrongPath: return "Le chemin de delegation est incorrect ('nomModule/nomMethode')"; break;
case self::UnknownModule: return "Le module n'existe pas"; break;
case self::UnknownMethod: return "Le methode n'existe pas"; break;
case self::UncallableMethod: return "Le methode n'est pas amorcable"; break;
}
return 'Aucune erreur trouvee';
}
}

191
manager/ModuleAnswer.php Executable file
View File

@ -0,0 +1,191 @@
<?php
namespace manager;
// FORMAT:
//
// path: "nomModule/nomMethode"
// data1: {donnee1}
// data2: {donnee2}
// ...
//
//
//
//
class ModuleAnswer{
// Attributs prives utiles (initialisation)
private $data;
public $error;
/* CONSTRUCTEUR D'UNE REPONSE DE MODULE
*
*/
public function __construct(){
}
public function dispatch(){
/* [1] On verifie qu'aucune erreur n'a ete signalee
=========================================================*/
if( $this->error != ManagerError::Success ) return false;
/* [2] On verifie que la methode est amorcable
=========================================================*/
if( !is_callable($this->getFunctionCaller()) ){
$this->error = ManagerError::UncallableMethod;
return false;
}
/* [3] On amorce la methode
=========================================================*/
return call_user_func_array( $this->getFunctionCaller(), $this->getData() );
}
/* DESERIALISATION ET CREATION D'UN OBJET
*
* @jsonString<String> Json au format string contenant les donnees
*
* @return instance<ModuleRequest> Retourne un objet de type <ModuleRequest>
*
*/
public static function fromString($jsonString){
$json = json_decode( $jsonString, true );
// Verification du parsage
if( $json == null )
return new ModuleRequest();
// Verification des parametres
if( !isset($json['path']) )
return new ModuleRequest();
// On definit $data au cas ou il soit vide
$data = (isset($json['data'])) ? $json['data'] : array();
return new ModuleRequest($json['path'], $data);
}
/* DESERIALISATION A PARTIR DES DONNEES POST
*
* @post<Array> Tableau des donnes $_POST => @path + @data (opt)
*
* @return instance<ModuleRequest> Retourne un objet de type <ModuleRequest>
*
*/
public static function fromURL($post){
/* [1] On verifie que le @path est renseigne
=========================================================*/
if( !isset($post['path']) )
return new ModuleRequest();
/* [2] On verifie que @data est renseigne
=========================================================*/
$data = (isset($post['data'])) ? $post['data'] : array();
/* [3] On retourne une instance de <ModuleRequest>
=========================================================*/
return new ModuleRequest($post['path'], $data);
}
/* VERIFICATION DU FORMAT ET DE LA COHERENCE DU CHEMIN SPECIFIE
*
* @path<String> String correspondant au chemin de delegation ("module/methode")
*
* @return validity<Boolean> Retourne si oui ou non l'objet est correct
*
*/
private function checkPath($path){
/* [1] Verification format general
=========================================================*/
if( !preg_match('#^([\w_-]+)/([\w_-]+)$#i', $path, $matches) ){ // Si mauvais format
$this->error = ManagerError::WrongPathType;
return false;
}
// On recupere les donnes de la regex
$module = $matches[1];
$method = $matches[2];
/* [2] Verification de l'existence du module (conf)
=========================================================*/
if( !array_key_exists($module, $this->modules) ){ // Si le module n'est pas specifie dans la conf
$this->error = ManagerError::UnknownModule;
return false; // On retourne FALSE, si erreur
}
/* [3] Verification de l'existence de la methode (conf)
=========================================================*/
if( array_search($method, $this->modules[$module]) === false ){ // Si la methode n'est pas specifie dans la conf
$this->error = ManagerError::UnknownMethod;
return false; // On retourne FALSE, si erreur
}
/* [4] Enregistrement du chemin et renvoi de SUCCESS
=========================================================*/
$this->path = array(
'module' => $module,
'method' => $method
);
return true;
}
/* RENVOI LE CHEMIN D'AMORCAGE DE LA METHODE
*
* @return path<Array> Retourne le chemin d'amorcage de la requete
*
*/
private function getFunctionCaller(){
return '\\manager\\module\\'.$this->path['module'].'::'.$this->path['method'];
}
/* RENVOI LES DONNEES
*
* @return data<Array> Retourne les donnees de la requete
*
*/
private function getData(){
return $this->data;
}
}
?>

29
manager/ModuleRequest.php Normal file → Executable file
View File

@ -142,6 +142,35 @@
/* DESERIALISATION A PARTIR DES DONNEES POST
*
* @post<Array> Tableau des donnes $_POST => @path + @data (opt)
*
* @return instance<ModuleRequest> Retourne un objet de type <ModuleRequest>
*
*/
public static function fromURL($post){
/* [1] On verifie que le @path est renseigne
=========================================================*/
if( !isset($post['path']) )
return new ModuleRequest();
/* [2] On verifie que @data est renseigne
=========================================================*/
$data = (isset($post['data'])) ? $post['data'] : array();
/* [3] On retourne une instance de <ModuleRequest>
=========================================================*/
return new ModuleRequest($post['path'], $data);
}
/* VERIFICATION DU FORMAT ET DE LA COHERENCE DU CHEMIN SPECIFIE
*
* @path<String> String correspondant au chemin de delegation ("module/methode")

View File

@ -68,7 +68,7 @@
/* [3] On construit le chemin a partir des tags
==================================================*/
if( !$this->buildPath() ){ // Construction du chemin
$this->error = ManagerError::FileNotFound;
$this->error = ManagerError::UnreachableResource;
return false;
}

View File

@ -1,5 +1,16 @@
<?php
function debug(){
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
}
function autoloader($className){
$path = '';

0
manager/module/firstModule.php Normal file → Executable file
View File

View File

@ -0,0 +1,39 @@
<?php
namespace manager\module;
class userDefaultModule{
public static function getAll(){
return \manager\Database::getPDO()->query("SELECT * FROM user ORDER BY id_user")->fetchAll();
}
public static function returnvar($var){
var_dump('return var'); return $var;
}
public static function printvar($var){
var_dump('var = '); var_dump($var);
}
}
?>

View File

@ -13,8 +13,13 @@
############
# EN COURS #
############
- [x] Gestion des erreurs
- [x] Explicitation
- [ ] Conception du systeme de delegation des managers
- [x] Module Request
- [x] Inline (en php)
- [x] Serialise (en json <String>)
- [x] Par url (POST)
- [ ] Module Answer
- [x] Conception BDD + ameliorations

View File

@ -40,8 +40,28 @@
<?php
$post = array();
foreach($_POST as $k=>$v)
array_push($post, $k);
$sublink = $post[0];
<section>
Bienvenue sur la page de gestion des UTILISATEURS
</section>
/* PAGE DES STATISTIQUES
*
*/
if( $sublink == 'displayall' ){
// On recupere tous les utilisateurs
debug();
$request = new \manager\ModuleRequest('userDefaultModule/getAll');
$users = $request->dispatch();
echo '<section>';
echo 'Liste des utilisateurs: <br>';
var_dump( $users );
echo '</section>';
}