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

Zend Framework PHP Discussion :

Url rewritting, comment cela fonctionne ?


Sujet :

Zend Framework PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut Url rewritting, comment cela fonctionne ?
    Bonsoir,

    Actuellement entrain de développer un projet web, voici ma problématique.

    1- Les noms des menus pourront être choisis dynamiquement, depuis un backoffice.

    2- Il y a aura des URL sous la forme monsite/mapage ou monsite/mapage/page.html, tout est dynamique à part bien sure le nom de domaine !

    Depuis Zend j'ai pensé à passé par le composant

    Zend_Controller_Router_Route_Regex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    (...)
    $routeRegex = new Zend_Controller_Router_Route_Regex(
        'teams/(d+)-(w+)',
        array('controller' =>'index', 'action' => 'teams'),
        array(1 => 'id',2=>'name'),
        'teams/%d-%s'
    );
    $router->addRoute('teams', $routeRegex);
    (..)

    - Est-il possible de créer plusieurs types de route dynamique, dans le bootstrap ?
    - Est-ce que je peux passer par la méthode protected function _initRouter() { du bootstrap, afin de prendre l'ensemble de mes contraintes exposés ci-dessus ?
    - Sinon, comme faire ?


    D'avance merci
    ++

  2. #2
    En attente de confirmation mail

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Points : 637
    Points
    637
    Par défaut
    Bonjour,

    Citation Envoyé par Cvbdev Voir le message
    Bonsoir,

    Actuellement entrain de développer un projet web, voici ma problématique.

    1- Les noms des menus pourront être choisis dynamiquement, depuis un backoffice.

    2- Il y a aura des URL sous la forme monsite/mapage ou monsite/mapage/page.html, tout est dynamique à part bien sure le nom de domaine !

    Depuis Zend j'ai pensé à passé par le composant
    Une Zend_Controller_Router_Route devrait suffire, avec une route du genre :module/:controller/:action.html

    - Est-il possible de créer plusieurs types de route dynamique, dans le bootstrap ?
    Ou via un fichier de configuration, en tout cas il n'y a pas de limite du nombre de routes dynamiques que tu peux définir.

    - Est-ce que je peux passer par la méthode protected function _initRouter() { du bootstrap, afin de prendre l'ensemble de mes contraintes exposés ci-dessus ?
    Soit dans _initRouter sans soucis, soit n'importe quelle méthode qui commence par _init (si la méthode commence par _init, elle est exécutée lors du bootstrap), soit par un fichier de configuration.

    Je te conseille cette doc pour y voir plus clair.
    Sur le bootstrap : http://framework.zend.com/manual/1.1...operation.html
    Sur le router : http://framework.zend.com/manual/1.1...er.router.html

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut
    Oki, super je teste deux trois choses avant de commencer l'application et te tiens au courant !

    ++

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut
    Bonjour,

    J'ai enfin réussi à créer des chemins.
    Trois questions complémentaires:

    L'utilisateur peut saisir une URL, faire appel à une page qui n'existe pas (EX: monsite/mapage/mapagequinexistepas.htm).

    1- Est-ce que je peux gérer cela depuis Zend_Controller_Router_Route_Regex ?
    ou faut-il passer par un plugin afin de vérifier l'information, si la page existe, et le renvoyer vers une page d'erreur ?

    2- Est-ce que les routes dans le bootstrap doivent être complémentés, par des références dans Application.ini ?
    J'ai l'impression que non, car lorsque je les enlève, cela ne perdube en rien le fonctionnement !

    3- En utilisant que Application.ini pour renseigner les routes, sans code dans le bootstrap, rien ne fonctionne, comme cela fonctionne t-il réellement ?


    PS : un exemple de code "brouillon" pour valider deux trois choses.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    	private $_front;
    	private $_routeur;
     
     
    	public function _initAutoload()
    	{
    		$this->_front = $this->bootstrap('FrontController')->getResource('FrontController');
        	$this->_routeur = $this->_front ->getRouter();   	
        	$uneRoute = new Zend_Controller_Router_Route($route, $defaults, $reqs);
    		$this->_routeur->addRoute('uneRoute', $uneRoute);
     
    	}
    	protected  function _initroute(){
     
     
     
        	    	echo '<pre>';
        	print_r($this->_routeur);
    		echo '</pre>';
     
     
    		$routeRegex = new Zend_Controller_Router_Route_Regex(
    		    '(\d+).html',
    		    array(
    		    	'controller' =>'index', 
    		    	'action' => 'index'),
    		    array(
    		    	1 => 'id'),
    		    '%d'
    			);
     
    		$this->_routeur->addRoute('index', $routeRegex);	
     
    		$routeRegex2 = new Zend_Controller_Router_Route_Regex(
    		    '([a-zA-Z0-9]+)/([0-9]+)',
    		    array(
    		    	'controller' =>'index', 
    		    	'action' => 'index'),
    		    array(1 => 'page',2 => 'nompage'),
    		    '%d'
    			);
     
     
    		$this->_routeur->addRoute('index2s', $routeRegex2);
    	}

  5. #5
    En attente de confirmation mail

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Points : 637
    Points
    637
    Par défaut
    Bonjour,

    Citation Envoyé par Cvbdev Voir le message
    Bonjour,

    J'ai enfin réussi à créer des chemins.
    Trois questions complémentaires:

    L'utilisateur peut saisir une URL, faire appel à une page qui n'existe pas (EX: monsite/mapage/mapagequinexistepas.htm).

    1- Est-ce que je peux gérer cela depuis Zend_Controller_Router_Route_Regex ?
    ou faut-il passer par un plugin afin de vérifier l'information, si la page existe, et le renvoyer vers une page d'erreur ?
    Le ZF le gère, car quand un élément n'est pas trouvé (action, contrôleur ou module) une exception est levée, et les exceptions sont interceptées et le ErrorController est utilisé pour effectuer le rendu. Si tu utilises une structure de projet classique, ton ErrorController doit déjà être généré, édite la vue error/error.phtml, tape une url inexistante et constate le changement !

    De base l'ErrorController est configuré pour être à même de traiter différemment les erreurs 404 (exceptions levées suite à un problème de routage) des erreurs 500 (les autres), mais tu peux affiner sans problème avec ton propre système, en utilisant certains types d'exceptions, etc.

    2- Est-ce que les routes dans le bootstrap doivent être complémentés, par des références dans Application.ini ?
    J'ai l'impression que non, car lorsque je les enlève, cela ne perdube en rien le fonctionnement !

    3- En utilisant que Application.ini pour renseigner les routes, sans code dans le bootstrap, rien ne fonctionne, comme cela fonctionne t-il réellement ?
    Le bootstrap et les plugins de ressources (qui sont alimentés par un fichier de configuration) sont deux modes de fonctionnement complémentaire. On peut utiliser l'un ou l'autre exclusivement, ou plus souvent un mélange des deux. L'avantage de la configuration est son cloisonnement par environnement, tandis que celui du Bootstrap est d'être plus transparent pour le développeur, et permet de faire plus de chose car donne un accès direct sur le code.

    Je te conseille de lire la doc sur Zend_Application, car c'est un vaste sujet : http://framework.zend.com/manual/1.1...ick-start.html

    Pour ton code, a priori tout me paraît complètement cohérent, j'aimerais juste savoir pourquoi tu configures une route dans une méthode _initAutoloader ? Juste pour rappel, les méthodes du bootstrap tu les nomme comme tu veux tant qu'elles commencent par _init, il n'y a pas plus de "magie" que ça et tu n'as pas de mot clés à respecter en particulier. Si tu as besoin de méthodes qui ne soient pas exécutées automatiquement (pour mieux segmenter ton code par exemple) il suffit qu'elles ne commencent pas par _init.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut
    Citation Envoyé par Nighty Voir le message
    Le ZF le gère, car quand un élément n'est pas trouvé (action, contrôleur ou module) une exception est levée, et les exceptions sont interceptées et le ErrorController est utilisé pour effectuer le rendu. Si tu utilises une structure de projet classique, ton ErrorController doit déjà être généré, édite la vue error/error.phtml, tape une url inexistante et constate le changement !
    Justement, dés que je tape une URL qui n'existe pas, la page s'affiche. C'est ce que je ne comprends pas. Le seule moment, ou la page ne s'affiche pas et renvoie vers une ErrorController, c'est quand la valeur saisie ne corresponds pas au regex !

    Je peux saisir http://monsite/page/page1/page2/.... ou http:// http://monsite/page/page1/page2/page3/page4 ça ne change rien !


    Citation Envoyé par Nighty Voir le message
    Pour ton code, a priori tout me paraît complètement cohérent, j'aimerais juste savoir pourquoi tu configures une route dans une méthode _initAutoloader ?
    En fait au départ j'étais parti sur l'idée de créer plusieurs _init... afin d'initialiser mes routes. Au lieu de créer plusieurs objets, je suis passer une méthode afin de créer un objet commun... !


    D'avance merci !
    ++

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut
    Pensez-vous qu'il faille que je fasses une post vérification (avec l'utilisation de Zend_Controller_Router_Route) afin de vérifier ce que tape l'utilisateur ?

    D'avance merci
    ++

  8. #8
    En attente de confirmation mail

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Points : 637
    Points
    637
    Par défaut
    En fait, la seule chose que le ZF peut faire pour toi, c'est s'assurer que l'url appelée par l'utilisateur "match" avec une route, et corresponde bien à un module / contrôleur / action qui existe.

    Si derrière ce que tu souhaites c'est par exemple contrôler qu'un article dont l'id passé en paramètre existe bien, ça effectivement ZF ne peut pas le faire pour toi : dans ce cas le plus simple est encore de lancer une exception d'un type particulier (PageNotFoundException, ou que sais-je) quand tu constates que le contenu demandé n'existe pas, et de modifier l'ErrorController pour que ce type d'exception provoque une page erreur 404... rien de très méchant, mais en tout cas ZF n'ira jamais gérer ça tout seul car ça dépends pleinement de ce que tu veux faire dans ton application.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut
    Oki, super. J'avais un doute, que tu viens de levé !
    Merci !

    ++

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/06/2009, 18h11
  2. ouinon comment cela fonctionne ?
    Par chapeau_melon dans le forum WinDev
    Réponses: 5
    Dernier message: 19/02/2008, 11h16
  3. snprintf comment cela fonctionne?
    Par deck_bsd dans le forum C
    Réponses: 3
    Dernier message: 24/11/2006, 15h20
  4. [Berkley DB] Comment cela fonctionne ?
    Par saidus dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 22/02/2006, 17h49
  5. [Caml] Du mal à comprendre comment cela fonctionne...
    Par Sir Caedes dans le forum Caml
    Réponses: 16
    Dernier message: 05/01/2006, 11h52

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