IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[MVC] router : éviter la page blanche [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Membre régulier

    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 89
    Points
    89
    Billets dans le blog
    2
    Par défaut [MVC] router : éviter la page blanche
    Bonjour,

    Développant un modèle MVC très simple et je l'espère très classique, je cherche à éviter que le visiteur ne tombe sur un page blanche s'il s'amuse avec les requêtes GET ou qu'une erreur se soit glissée.
    Voici le script du routeur :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    require_once(".." . DIRECTORY_SEPARATOR . "public" . DIRECTORY_SEPARATOR . "config". DIRECTORY_SEPARATOR ."config.php");
    require_once("router_configuration.php");
    if($_GET){
    	foreach ($routes AS $controller => $actions) {
    		foreach ($actions as $action) {
    			if (in_array($_GET['controller'], array_keys($routes))) {
    				if (isset($_GET['controller']) && $_GET['controller'] == $controller) {
    					require_once(".." . DIRECTORY_SEPARATOR . "controller" . DIRECTORY_SEPARATOR . $controller . '.php');
    					if (isset($_GET['action']) && $_GET['action'] == $action) {
    						$controller = ucfirst($controller);
    						$obj = new $controller;
    						$obj->$action();
    					}
    				}
    			} else {
    				header('location:' . RACINE_SITE);
    			}
    		}
    	}
    }
    Et le fichier de configuration :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $routes = [
    	'controller_users' => ['connexion','deconnexion','profil','maj','mdpPerdu','inscription'],
    	'controller_salles' => ['index','reservation','recherche','reservationDetails','modiPosts','supriPosts']
    ]

    J'arrive à faire en sorte que lorsque le visiteur modifie la valeur du GET du controller il soit redirigé vers la page d'accueil. En revanche, la même opération avec l'action ne fonctionne pas, le visiteur tombe sur une page blanche en tapant volontairement 'inddex' au lieu de index par exemple :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    if (in_array($_GET['controller'], array_keys($routes)) && in_array($_GET['action'], $actions) ) {

    Par avance, merci pour toute aide, même une remarque sur la qualité de ce code

  2. #2
    Membre régulier

    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 89
    Points
    89
    Billets dans le blog
    2
    Par défaut
    Bonjour
    Pas même une petite idée ?

  3. #3
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Redirige le vers une page spéciale (type 404.php), et retourne un code d'erreur 404.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  4. #4
    Membre régulier

    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 89
    Points
    89
    Billets dans le blog
    2
    Par défaut
    Bonne idée, merci
    Mais je cherche justement à savoir comment.

  5. #5
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Ben il suffit de créer un "else" à ton if :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (in_array($_GET['controller'], array_keys($routes)) && in_array($_GET['action'], $actions) ) {
     //tout va bien, exécution du code...
    } else {
      //page n'existe pas, redirection vers 404
    }
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  6. #6
    Membre régulier

    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 89
    Points
    89
    Billets dans le blog
    2
    Par défaut
    Merci à toi, pour l'avoir essayé cela ne fonctionne pas. Avec une telle condition la redirection est systématique
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    if($_GET){
    	$i=0;
    	foreach ($routes AS $controller => $actions) {
    		foreach ($actions as $action) {
    			if (in_array($_GET['controller'], array_keys($routes)) && in_array($_GET['action'], $actions)) {
    				if (isset($_GET['controller']) && $_GET['controller'] == $controller) {
    					require_once(".." . DIRECTORY_SEPARATOR . "controller" . DIRECTORY_SEPARATOR . $controller . '.php');
    					if (isset($_GET['action']) && $_GET['action'] == $action) {
    						$controller = ucfirst($controller);
    						$obj = new $controller;
    						$obj->$action();
    					}
    				}
    			} else {
    				header('location:' . RACINE_SITE);
    			}
    		}
    	}
    }

  7. #7
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Pourquoi passes-tu par des boucles ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    if($_GET){
    	$i=0;
    			if (in_array($_GET['controller'], array_keys($routes)) && in_array($_GET['action'], $actions)) {
    				if (isset($_GET['controller']) && $_GET['controller'] == $controller) {
    					require_once(".." . DIRECTORY_SEPARATOR . "controller" . DIRECTORY_SEPARATOR . $controller . '.php');
    					if (isset($_GET['action']) && $_GET['action'] == $action) {
    						$controller = ucfirst($controller);
    						$obj = new $controller;
    						$obj->$action();
    					}
    				}
    			} else {
    				header('location:' . RACINE_SITE);
    			}
    }
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  8. #8
    Membre régulier

    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 89
    Points
    89
    Billets dans le blog
    2
    Par défaut
    Chacune des deux boucles parcourent le tableau $route en fonction du niveau auquel elle interviennent.
    Effectivement, ce serait une bonne idée de s'en passer le plus possible en faisant quelque chose du genre :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    	if($_GET){
    		$i=0;
    		for ($i=0;$i<sizeof($routes);$i++) {
    			if (in_array($_GET['controller'], array_keys($routes)) && in_array($_GET['action'], $routes[array_keys($routes)[$i]])) {
    				if (isset($_GET['controller']) && $_GET['controller'] == $controller) {
    					require_once(".." . DIRECTORY_SEPARATOR . "controller" . DIRECTORY_SEPARATOR . $controller . '.php');
    					if (isset($_GET['action']) && $_GET['action'] == $action) {
    						$controller = ucfirst($controller);
    						$obj = new $controller;
    						$obj->$action();
    					}
    				}
    			} else {
    				//header('location:' . RACINE_SITE);
    			}
    		}
    Mais là encore, cela ne fonctionne pas : la combinaison controller+action ne donne lieu à aucun contenu voulu.

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Récapitulons : Tu veux vérifier que le contrôleur demandé est dans la liste des contrôleurs et que l'action demandée est dans la liste des actions du contrôleur, avant de déclencher l'action. C'est bien ça ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  10. #10
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Je comprend pas ta boucle puisque de toutes façons il y a qu'un seul routage possible pour ta route.

    Je te propose une autre approche bien plus simple sans boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $routeOk = false;
    if (array_key_exist($_GET['controller'],$routes)) {
    	$actions = $routes[$_GET['controller']];
    	if (in_array($_GET['action'],$actions)) {
    		$action = $_GET['action'];
    		$routeOk = true;
    	}
    } 
     
    if ($routeOk) {
    	//on continue la requête
    } else {
    	//route inexistante
    }
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  11. #11
    Membre régulier

    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 89
    Points
    89
    Billets dans le blog
    2
    Par défaut
    Désolé pour le temps pris avant réponse. Merci pour la tienne
    Effectivement, une condition est bien plus bien plus élégante qu'une boucle ! À titre indicatif, voici ce que cela donne :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    $routeOk = false;
    if($_GET){
    	if (array_key_exists($_GET['controller'],$routes)) {
    		$controller = $_GET['controller'];
    		$action = $routes[$_GET['controller']];
    			if(in_array($_GET['action'],$action)){
    				$action = $_GET['action'];
    				$routeOk = true;
    			}
    	}
    	if ($routeOk) {
    		require_once(".." . DIRECTORY_SEPARATOR . "controller" . DIRECTORY_SEPARATOR . $controller . '.php');
    		$controller = ucfirst($controller);
    		$obj = new $controller;
    		$obj->$action();
    	} else {
    		header('location:' . RACINE_SITE);
    	}
    } else {
    	require_once("..".DIRECTORY_SEPARATOR."controller".DIRECTORY_SEPARATOR."controller_salles.php");
    	$obj = new Controller_salles();
    	$obj->index();
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 31/03/2010, 18h12
  2. Comment éviter les pages blanches dans un état?
    Par Noline dans le forum Access
    Réponses: 2
    Dernier message: 31/07/2006, 16h30
  3. [Directives] Page blanche quand erreur de syntaxe
    Par syl2095 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 17/02/2006, 15h15
  4. [C#] Page blanche lors avec Response (NFop)
    Par SoaB dans le forum ASP.NET
    Réponses: 2
    Dernier message: 16/06/2005, 16h26
  5. [CR] Avoir seulement une page blanche qd la base est vide???
    Par littleChick dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 13/08/2002, 18h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo