Controleur GET/POST/DELETE

MI7
Eléphanteau du PHP | 12 Messages

18 mars 2020, 02:32

Salut à vous j'ai besoin de réponse ou d'un bon tuto fr qui pourrait m'expliquer ce qui suit.

je cherche à comprendre ce qui se passe a cette endroit de mon code.

Code : Tout sélectionner

class Controleur { private $requetes = array( "piscines/:id/horaires" => array( 'GET' => 'getHorairesByPiscine', 'POST' => 'postHoraire', 'DELETE' => 'deleteHoraire' )


Quand je rentre ceci : piscines/1/horaires .dans le url de mon navigateur

il me sors les horaires de l'id 1 qui est dans ma BDD. (je comprend cela)
par contre si je veux utiliser le POST ou DELETE qui sont dans le même URL, comment je fais pour faire fonctionner mon DELETE ou le POST?
Comment on peut avoir 3 type de requête sur le même url c'est ce que je comprends absolument pas.

le GET tout le monde peut avoir accès
le POST et DELETE l'utilisateur doit être enregistré pour utiliser ceux ci. $users = array('582P41' => 'ABC123');

j'aimerais pouvoir commencer à comprendre ce que je fais et faire la partie la plus simple le delete et ensuite me concentrer sur l'ajout et modification d'une horaire.


Voici mon controleur.class.php

Code : Tout sélectionner

<?php /** * Classe Controleur * pour gérer le service web */ class Controleur { private $requetes = array( "arrondissements" => array( 'GET' => 'getArrondissements' ), "arrondissements/:code3l" => array( 'GET' => 'getArrondissement', ), "piscines" => array( 'GET' => 'getPiscines' ), "piscines/:id" => array( 'GET' => 'getPiscine', ), "piscines/:code3l" => array( 'GET' => 'getPiscinesByArrondissement', ), "piscines/:id/horaires" => array( 'GET' => 'getHorairesByPiscine', 'POST' => 'postHoraire', 'DELETE' => 'deleteHoraire' ), "piscines/:id/horaires?date" => array( 'GET' => 'getHorairesByDate', ) ); /* URL internet pour avoir accès aux données... - wspiscine/arrondissements - wspiscine/arrondissements?code3l=ANJ - wspiscine/piscines - wspiscine/piscines?code3l=ANJ - wspiscine/piscines/6 - wspiscine/piscines/1/horaires - wspiscine/piscines/1/horaires?date=20180503 */ private $ressource; private $code3l; private $action; private $id; private $date; const ERROR_RESSOURCE = "HTTP 400"; const ERROR_PWD = "HTTP 401"; const ERROR_METHOD = "HTTP 405"; public function __construct() { /* Routage des requêtes en fonction de l'uri et de la méthode (GET, POST, PUT ou DELETE) ---------------------------------------------------------------- */ $this->ressource = isset($_GET['ressource']) ? $_GET['ressource'] : ''; $this->code3l = isset($_GET['code3l']) ? $_GET['code3l'] : ''; $this->id = isset($_GET['id']) ? $_GET['id'] : ''; $this->date = isset($_GET['date']) ? $_GET['date'] : ''; $this->action = isset($_GET['action']) ? $_GET['action'] : ''; $uriRequest = ''; if ($this->ressource !== '') $uriRequest .= $this->ressource; if ($this->code3l !== '') $uriRequest .= '/:code3l'; if ($this->id !== '') $uriRequest .= '/:id'; if ($this->action !== '') $uriRequest .= '/' . $this->action; echo $_SERVER['PHP_AUTH_USER']; try { foreach ($this->requetes as $uri => $methodes) { if ($uri === $uriRequest) { foreach ($methodes as $methode => $fonction) { if ($methode === $_SERVER['REQUEST_METHOD']) { if ($methode !== 'GET' && !$this->validerUtilisateur($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) { throw new Exception(self::ERROR_PWD); } $this->$fonction(); exit; } } throw new Exception(self::ERROR_METHOD); } } throw new Exception(self::ERROR_RESSOURCE); } catch (Exception $e) { $this->erreur($e->getMessage()); exit; } } /* Traitement des erreurs avec l'envoi d'un code HTTP -------------------------------------------------- */ /** * Traitement des erreurs interceptées pat le try/catch * @param message de l'exception * @return */ private function erreur($erreur) { $message = ''; if ($erreur == self::ERROR_RESSOURCE) { header('HTTP/1.1 400 Bad Request'); } elseif ($erreur == self::ERROR_PWD) { header('HTTP/1.1 401 Unauthorized'); } elseif ($erreur == self::ERROR_METHOD) { header('HTTP/1.1 405 Method Not Allowed'); } else { header('HTTP/1.1 500 Internal Server Error'); echo $erreur; } } /* Contrôle de l'utilisateur si requête PUT, POST ou DELETE -------------------------------------------------------- */ /** * Traitement des erreurs interceptées pat le try/catch * @param identifiant et mot de passe de l'utilisateur * @return boolean */ private function validerUtilisateur($user, $pass) { $users = array('582P41' => 'ABC123'); if (isset($users[$user]) && $users[$user] === $pass) { return true; } else { return false; } } /*----------------Arrondissement--------------------------*/ /** * Liste des arrondissements * @param void * @return */ private function getArrondissements() { $req = new RequetesPDO(); if (isset($_GET['code3l'])) { $arrondissement = $req->chercherAcronyme($_GET['code3l']); } else { $arrondissement = $req->getArrondissements(); echo json_encode($arrondissement); echo '<pre>', print_r($arrondissement), '</pre>'; } } /** * Informations sur l'arrondissement d'code3l $_GET['code3l'] * @param void * @return */ private function getArrondissement() { $req = new RequetesPDO(); $arrondissement = $req->getArrondissement($this->code3l); echo json_encode($arrondissement); } /*--------------------------PISCINE----------------------------------*/ /** * Liste des piscines * @param void * @return */ private function getPiscines() { $req = new RequetesPDO(); $piscines = $req->getPiscines(); echo json_encode($piscines); echo '<pre>', print_r($piscines), '</pre>'; } /** * Informations sur une piscine via sont id $_GET['id'] * @param void * @return */ private function getPiscine() { $req = new RequetesPDO(); $piscine = $req->getPiscine($this->id); echo json_encode($piscine); } /** * Informations sur une piscine via son code3l $_GET['code3l'] * @param void * @return */ private function getPiscinesByArrondissement() { $req = new RequetesPDO(); $piscines = $req->getPiscinesByArrondissement($this->code3l); echo json_encode($piscines); echo '<pre>', print_r($piscines), '</pre>'; } /*------------------------Horaire------------------*/ /** * Informations sur l'horaire via son id $_GET['id'] * @param void * @return */ private function getHorairesByPiscine() { $req = new RequetesPDO(); $horaires = $req->getHorairesByPiscine($this->id); echo json_encode($horaires); echo '<pre>', print_r($horaires), '</pre>'; } /** * Informations sur l'horaire via sont id et ca date $_GET['id'], $_GET['date'] * @param void * @return */ private function getHorairesByDate() { $req = new RequetesPDO(); $horaires = $req->getHorairesByDate($this->id, $this->date); echo json_encode($horaires); echo '<pre>', print_r($horaires), '</pre>'; } /** * Supprimer l'horaire d'une piscine via l'id $_GET['id'] * @param void * @return */ private function deleteHoraire() { $req = new RequetesPDO(); $codeRetour = $req->supprimerHoraire($this->id); echo json_encode($codeRetour); } /** NE FONCTIONNE PAS, DOIT ETRE CORIGÉ * Modifier l'horaire et si elle n'existe pas on rajoute l'horaire * @param void * @return */ private function postHoraire() { $req = new RequetesPDO(); $horaires = $req->getHorairesByPiscine($this->id); if ($horaires === null || sizeof($horaires) === 0) { echo "1"; $req = new RequetesPDO(); // Trace::writeLog(print_r(json_decode($_POST['arrondissement']), true)); foreach ($horaires as $horaire) { $horaire = json_decode(file_get_contents("php://input"), true); // ou : $horaire = json_decode($_POST['horaire'], true); $oHoraire = new Horaire(...array_values($horaire)); if (count($oHoraire->erreurs) === 0) { $codeRetour = $req->ajouterHoraire(...array_values($horaire)); echo json_encode($codeRetour); } else { echo json_encode(["erreurs de données" => $oHoraire->erreurs]); } } } else { foreach ($horaires as $horaire) { $horaireActuel = $horaire; $horaire = json_decode(file_get_contents("php://input"), true); // ou : $horaire = json_decode(file_get_contents("php://input"), true); array_shift($horaireActuel); // pour enlever le champ id $oHoraire = new Horaire(...array_values($horaireActuel)); foreach ($horaire as $key => $value) { if (!is_null($value)) $oHoraire->$key = $value; } if (count($oHoraire->erreurs) === 0) { echo $this->id; echo $horaire; $codeRetour = $req->modifierHoraire($this->id, ...array_values($horaire)); echo json_encode($codeRetour); } else { echo json_encode(["erreurs de données" => $oHoraire->erreurs]); } } } } }

RequetesPDO.class.php

Code : Tout sélectionner

<?php /** * Classe des requêtes PDO * */ class RequetesPDO { /** * Récupération de tous les arrondissements de la table arrondissement * * @return array */ public function getArrondissements() { $sPDO = SingletonPDO::getInstance(); // Avec une requête non préparée // ============================= $oPDOStatement = $sPDO->query( 'SELECT code3l, nom, acronyme FROM arrondissement ORDER BY code3l ASC' ); $arrondissements = $oPDOStatement->fetchAll(PDO::FETCH_ASSOC); return $arrondissements; } /** * Récupération d'un arrondissement de la table arrondissement à partir de son code3l * * @return array or boolean false if no result */ public function getArrondissement($code3l) { $sPDO = SingletonPDO::getInstance(); $oPDOStatement = $sPDO->prepare( 'SELECT code3l, nom, acronyme FROM arrondissement WHERE code3l = :code3l' ); $oPDOStatement->bindParam(':code3l', $code3l); $oPDOStatement->execute(); $arrondissement = $oPDOStatement->fetch(PDO::FETCH_ASSOC); return $arrondissement; } /** * Récupération des arrondissements de la table arrondissement pour l'acronyme fournie en paramètre * * @return array */ public function chercherAcronyme($acronyme) { $sPDO = SingletonPDO::getInstance(); $oPDOStatement = $sPDO->prepare( 'SELECT code3l, nom, acronyme FROM arrondissement WHERE acronyme = :acronyme ORDER BY code3l DESC' ); $oPDOStatement->bindParam(':acronyme', $acronyme); $oPDOStatement->execute(); $arrondissements = $oPDOStatement->fetchAll(PDO::FETCH_ASSOC); return $arrondissements; } /*--------------------SECTION PISCINE----------------------------------*/ /** * Récupération de tous les piscines de la table arrondissement * * @return array */ public function getPiscines() { $sPDO = SingletonPDO::getInstance(); // Avec une requête non préparée // ============================= $oPDOStatement = $sPDO->query( 'SELECT id_piscine, type, nom, arrondissement_code3l, adresse, propriete, gestion FROM piscine ' ); $piscines = $oPDOStatement->fetchAll(PDO::FETCH_ASSOC); return $piscines; } /** * Récupération d'une information sur une piscine de la table piscine à partir de son id * * @return array or boolean false if no result */ public function getPiscine($id) { $sPDO = SingletonPDO::getInstance(); $oPDOStatement = $sPDO->prepare( 'SELECT id_piscine, type, nom, arrondissement_code3l, adresse, propriete, gestion FROM piscine WHERE id_piscine = :id_piscine' ); $oPDOStatement->bindParam(':id_piscine', $id); $oPDOStatement->execute(); $piscine = $oPDOStatement->fetch(PDO::FETCH_ASSOC); return $piscine; } /** * Récupération des piscines de la table piscine à partir de son code3l * * @return array or boolean false if no result */ public function getPiscinesByArrondissement($code3l) { $sPDO = SingletonPDO::getInstance(); $oPDOStatement = $sPDO->prepare( 'SELECT id_piscine, type, nom, arrondissement_code3l, adresse, propriete, gestion FROM piscine WHERE arrondissement_code3l = :code3l' ); $oPDOStatement->bindParam(':code3l', $code3l); $oPDOStatement->execute(); $piscines = $oPDOStatement->fetchAll(PDO::FETCH_ASSOC); return $piscines; } /*----------SECTION---Horraire----------------*/ /** * Récupération des horaires de la table horaire a partir de son id * * @return array or boolean false if no result */ public function getHorairesByPiscine($id) { $sPDO = SingletonPDO::getInstance(); $oPDOStatement = $sPDO->prepare( 'SELECT id_piscine, jour, debut, fin FROM horaire WHERE id_piscine = :id' ); $oPDOStatement->bindParam(':id', $id); $oPDOStatement->execute(); $horaires = $oPDOStatement->fetchAll(PDO::FETCH_ASSOC); return $horaires; } /** * Récupération d'une horaire recuperer par son jour * * @return array or boolean false if no result */ public function getHorairesByDate($id, $date) { $sPDO = SingletonPDO::getInstance(); $oPDOStatement = $sPDO->prepare( 'SELECT id_piscine, jour, debut, fin FROM horaire WHERE DAYOFWEEK(:date) = jour' ); $oPDOStatement->bindParam(':id', $id); $oPDOStatement->bindParam(':date', $date); $oPDOStatement->execute(); $horaires = $oPDOStatement->fetchAll(PDO::FETCH_ASSOC); if ($oPDOStatement->rowCount() === 0) { return false; } else return $horaires; } /** * Suppression d'une horaire dans la table horaire à partir de son id * * @return boolean */ public function supprimerHoraire($id) { $sPDO = SingletonPDO::getInstance(); $oPDOStatement = $sPDO->prepare( 'DELETE FROM horaire WHERE id_piscine=:id_piscine;' ); $oPDOStatement->bindParam(':id_piscine', $id); $oPDOStatement->execute(); if ($oPDOStatement->rowCount() == 0) { return false; } return true; } /** * Modification d'une horaire dans la table horaire à partir de son id * * @return boolean */ public function modifierHoraire($id_piscine, $jour, $debut, $fin) { $sPDO = SingletonPDO::getInstance(); echo $jour; if ($jour != null || $debut != null || $fin != null) { $items = ''; if ($jour != null) $items .= 'jour=:jour,'; if ($debut != null) $items .= 'debut=:debut,'; if ($fin != null) $items .= 'fin=:fin,'; $items = rtrim($items, ','); $oPDOStatement = $sPDO->prepare( 'UPDATE horaire SET ' . $items . ' WHERE id_piscine=:id_piscine;' ); $oPDOStatement->bindParam(':id_piscine', $id_piscine); if ($jour != null) $oPDOStatement->bindParam(':jour', $jour); if ($debut != null) $oPDOStatement->bindParam(':debut', $debut); if ($fin != null) $oPDOStatement->bindParam(':fin', $fin); $oPDOStatement->execute(); if ($oPDOStatement->rowCount() == 0) { return false; } return true; } return false; } /** * Ajout d'une horaire dans la table horaire * * @return boolean */ public function ajouterHoraire($jour, $debut, $fin) { $sPDO = SingletonPDO::getInstance(); $oPDOStatement = $sPDO->prepare( 'INSERT INTO horaire SET jour=:jour, debut=:debut, fin=:fin;' ); $oPDOStatement->bindParam(':jour', $jour); $oPDOStatement->bindParam(':debut', $debut); $oPDOStatement->bindParam(':fin', $fin); $oPDOStatement->execute(); if ($oPDOStatement->rowCount() == 0) { return false; } return true; } }


merci de prendre de votre temps a demain.

Avatar du membre
Mammouth du PHP | 1174 Messages

18 mars 2020, 02:47

Bonsoir,

A priori GET, POST, DELETE c'est la méthode. GET et POST sont standards pour un site mais pas DELETE (tu peux toujours essayer).
Et en HTML pour forcer la méthode bah à part sur un form avec method="POST" ou via un call XHR où on peut aussi définir la méthode, y a pas trente six milles solutions.

PS : sinon j'aime bien l'idée des routes définies comme ça dans le contrôleur, et si tes urls match avec tes routes, tu peux je pense grandement optimiser la recherche de la route et la définition des paramètres car il sont nommés dans les routes. Tu pourrais ensuite transférer ce code dans une classe contrôleur parente et étendre cette classe pour tous tes contrôleurs.
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^