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 :

Regex du tuto de Julien Pauli (MVC controleur)


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Regex du tuto de Julien Pauli (MVC controleur)
    Bonjour a tous,

    Je suis en train de suivre le tutoriel de Julien Pauli :
    http://julien-pauli.developpez.com/t...vc-controleur/

    J'ai beaucoup de mal a comprendre l'expression reguliere suivante (qui se trouve dans la classe Request du paragraphe III.Le frontController ou contrôleur frontal ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match("#^(/(?P<module>\w+))(/(?P<action>\w+)/?)?$#", $path, $matches);
    Il s'agit de parser l'URL pour déterminer un module, une action, et des paramètres.
    C'est la premiere fois que je vois l'utilisation de P ou de textes encadres de <> dans une regex, je ne comprends pas ce qu'ils signifient.

    J'ai fait quelques tests avec les exemples d'URL que donne l'auteur (pour essayer de mieux comprendre) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    http://monsite.com/index.php?module=bibliotheque&action=show_livres&categorie=x 
    http://monsite.com/index.php/bibliotheque/show_livres?categorie=x
    mais cela ne fonctionne malheureusement pas.

    Si vous comprenez cette expression reguliere, pourriez vous m'expliquer comment elle fonctionne, svp ?
    Merci de votre aide.

    ps) desole pour l'absence des accents, j'utilise un clavier qwerty.
    Dernière modification par Invité ; 26/10/2007 à 11h28.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Citation Envoyé par ipso Voir le message
    J'ai fait quelques tests avec les exemples d'URL que donne l'auteur (pour essayer de mieux comprendre) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    http://monsite.com/index.php?module=bibliotheque&action=show_livres&categorie=x 
    http://monsite.com/index.php/bibliotheque/show_livres?categorie=x
    mais cela ne fonctionne malheureusement pas.
    Vous ne risquez pas d'obtenir une correspondance avec ces chaînes C'est la partie chemin qui est testée et non l'URL complète : remarquez notamment que la chaîne attendue doit commencer par un slash.

    Citation Envoyé par ipso Voir le message
    Il s'agit de parser l'URL pour déterminer un module, une action, et des paramètres.
    C'est la premiere fois que je vois l'utilisation de P ou de textes encadres de <> dans une regex, je ne comprends pas ce qu'ils signifient.
    C'est pour nommer le motif (la capture) : appliquez print_r ou var_dump sur $matches, vous verrez bien le résultat avec et sans. (d'ailleurs on le voit bien dans la manière dont est utilisé ce résultat dans la classe frontController, méthode dispatch).

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    merci pour votre reponse.

    Vous ne risquez pas d'obtenir une correspondance avec ces chaînes C'est la partie chemin qui est testée et non l'URL complète : remarquez notamment que la chaîne attendue doit commencer par un slash.
    Oui, en fait je teste avec la fonction entiere. Voici mon script de tests :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    function route() {
     
    	echo "<br>REQUEST_URI = ".$_SERVER["REQUEST_URI"];
     
    	$requestUri = substr($_SERVER["REQUEST_URI"], strpos($_SERVER["REQUEST_URI"], "/".basename(__FILE__)) + strlen("/".basename(__FILE__)));
     
    	echo "<br>requestUri = ".$requestUri;
    	if (empty($requestUri)) {
    		return array();
    	}
     
    	$path = parse_url($requestUri, PHP_URL_PATH);
    	echo "<br>path = ".$path;
     
    	preg_match("#^(/(?P<module>\w+))(/(?P<action>\w+)/?)?$#", $path, $matches);
     
    	$args = explode("&", parse_url($requestUri, PHP_URL_QUERY));
    	echo "<br>args = ";
    	print_r($args);
     
    	echo "<br>matches = ";
    	print_r($matches);
     
    	return $matches;
    }
     
    $mavar = route();
    echo "<br>mavar = ";
    print_r($mavar);
    TEST 1 avec la chaine /index.php?module=bibliotheque&action=show_livres&categorie=x, resultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    REQUEST_URI = /index.php?module=bibliotheque&action=show_livres&categorie=x
    requestUri = bliotheque&action=show_livres&categorie=x
    path = bliotheque&action=show_livres&categorie=x
    args = Array ( [0] => )
    matches = Array ( )
    mavar = Array ( )
    TEST 2 avec la chaine /index.php/bibliotheque/show_livres?categorie=x, resultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    REQUEST_URI = /index.php/bibliotheque/show_livres?categorie=x
    requestUri = que/show_livres?categorie=x
    path = que/show_livres
    args = Array ( [0] => categorie=x )
    matches = Array ( )
    mavar = Array ( )
    je ne pense pas que les sorties soient valables dans mon cas...
    Pourriez-vous me donner un exemple de chaine pour lequel cela fonctionne svp ?
    Merci pour votre aide.

  4. #4
    Invité
    Invité(e)
    Par défaut
    hop hop hop !!
    Argh, je me suis completement plante, je recommence :

    Voici ma fonction test :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    function route() {
     
    	echo "<br>REQUEST_URI = ".$_SERVER["REQUEST_URI"];
    	echo "<br>basename = ".basename(__FILE__);
     
    	$requestUri = substr($_SERVER["REQUEST_URI"], strpos($_SERVER["REQUEST_URI"], "/".basename(__FILE__)) + strlen("/".basename(__FILE__)));
     
    	echo "<br>requestUri = ".$requestUri;
    	if (empty($requestUri)) {
    		return array();
    	}
     
    	$path = parse_url($requestUri, PHP_URL_PATH);
    	echo "<br>path = ".$path;
     
    	preg_match("#^(/(?P<module>\w+))(/(?P<action>\w+)/?)?$#", $path, $matches);
     
    	$args = explode("&", parse_url($requestUri, PHP_URL_QUERY));
    	echo "<br>args = ";
    	print_r($args);
     
    	echo "<br>matches = ";
    	print_r($matches);
     
    	return $matches;
    }
     
    $mavar = route();
    echo "<br>mavar = ";
    print_r($mavar);
    Voici ma chaine de test :
    (mon erreur dans le post precedent est d'avoir donne arbitrairement une var $_SERVER["REQUEST_URI"] alors que le script decortique l'url du script en lui meme, vous suivez ? Donc pour moi, le chemin complet de mon script de test est le suivant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    http://localhost/dev/TESTS/FrontController_pauli/test_preg_match.php/bibliotheque/show_livres?categorie=x
    Voici les resultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    REQUEST_URI = /dev/TESTS/FrontController_pauli/test_preg_match.php/bibliotheque/show_livres?categorie=x
    basename = test_preg_match.php
    requestUri = /bibliotheque/show_livres?categorie=x
    path = /bibliotheque/show_livres
    args = Array ( [0] => categorie=x )
    matches = Array ( [0] => /bibliotheque/show_livres [1] => /bibliotheque [module] => bibliotheque [2] => bibliotheque [3] => /show_livres [action] => show_livres [4] => show_livres )
    mavar = Array ( [0] => /bibliotheque/show_livres [1] => /bibliotheque [module] => bibliotheque [2] => bibliotheque [3] => /show_livres [action] => show_livres [4] => show_livres )
    Bon ca commence a ressembler a quelquechose, j'y vois plus clair.
    Je continue mon travail de comprehension...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Maintenant je vous montre l'interet d'utiliser des motifs dans la regex (suite a la pertinente remarque de julp).

    TEST 1 : la regex est de la forme suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match("#^(/(?P<module>\w+))(/(?P<action>\w+)/?)?$#", $path, $matches);
    Le resultat est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    matches = Array
    (
        [0] => /bibliotheque/show_livres
        [1] => /bibliotheque
        [module] => bibliotheque
        [2] => bibliotheque
        [3] => /show_livres
        [action] => show_livres
        [4] => show_livres
    )
    TEST 2 : la regex est de la forme
    (j'ai enleve ?P<module> et ?P<action>)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match("#^(/(\w+))(/(\w+)/?)?$#", $path, $matches);
    le resultat est alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    matches = Array
    (
        [0] => /bibliotheque/show_livres
        [1] => /bibliotheque
        [2] => bibliotheque
        [3] => /show_livres
        [4] => show_livres
    )
    Je comprends maintenant l'interet de ?P<module> et ?P<action>, ils permettent de manipuler directement le tableau de valeurs avec les clefs module et action...
    Merci Julien (trop bon ce tuto !!) et Julp.

Discussions similaires

  1. MVC Controleur vers JSP via JavaBean
    Par anthony04200 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 10/03/2013, 09h00
  2. [Débutant] MVC Controleurs probleme
    Par mirtouf dans le forum ASP.NET MVC
    Réponses: 2
    Dernier message: 02/03/2013, 16h05
  3. Erreur dans le tuto de julien-pauli
    Par thebarbarius dans le forum Zend Framework
    Réponses: 7
    Dernier message: 12/07/2011, 11h21
  4. [Spring MVC] Controleur sans vue?
    Par Ylias dans le forum Spring Web
    Réponses: 4
    Dernier message: 07/05/2008, 11h54

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