Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 06-11-2008 09:53:00

squall6969
Membre
Date d'inscription: 14-09-2008
Messages: 90

différence plugin // route

Bonjour à toutes et à tous,

Je suis en train d'essayer de faire tous les tutos lister sur ce site, et j'aurais voulu avoir plus de précision sur la différence entre plugin et route.

En effet dans le tuto http://www.kitpages.fr/zf_helper_plugin.php , il est dit que un plugin permet:
    * d'influer sur un routage
    * de vérifier des droits d'accès (et donc de modifier le routage si l'internaute n'a pas les droits nécessaires)
    * ...

Donc si j'ai bien compris, on se sert d'un plugin pour surcharger le router dans le cas par exemple où l'utilisateur n'aurait pas les droits suffisant pour accéder à une page ?

Il faut donc d'abord créer en routage sans se soucier des privilèges, et par la suite, en combinaison avec le zend_acl, on influe sur le routage grâce au plugin ???



Merci

Hors ligne

 

#2 06-11-2008 10:05:50

NewSky
Membre
Date d'inscription: 17-12-2007
Messages: 79

Re: différence plugin // route

Salut,

la différence est on ne peut plus flagrante : les routes ne servent uniquement qu'à faire correspondre l'url avec les modules/controllers/actions/params... Pour schématiser, il remplace le mod_rewrite d'apache!
Les plugins, eux, permettent certes d'influencer le routage dans certains cas, mais ne sont absolument pas là pour "surcharger" le routeur. Ils sont là pour effectuer des "actions/tests/..." peut importe la route demandée justement! Alors effectivement dans le cas d'une vérification d'authentification/droit, on influence le routage selon le résultat des tests, mais dans d'autres cas, on ne tiendrait même pas compte du routeur. Cela évite essentiellement d'avoir à écrire le même code dans tous les contrôleurs.

Hors ligne

 

#3 06-11-2008 10:46:11

squall6969
Membre
Date d'inscription: 14-09-2008
Messages: 90

Re: différence plugin // route

Merci pour ta réponse NewSky,

Cela répond tout à fait à ma question, cependant quand tu dis que "Cela évite essentiellement d'avoir à écrire le même code dans tous les contrôleurs.",  n'est-ce pas le rôle des Helper ?

En effet dans le tuto,(lien du 1er post) je note "Les helpers permettent notamment de faire des opérations systématiquement sur tous vos controlleurs sans avoir à répéter le code dans toutes vos actions."

Je retiendrais donc:
-plugin, pour influancer le routage standard en fonction par exemple de privilèges
-helper, assigner du code à chaque méthode d'un controller


Etais-ce une erreur de ta part d'avoir confondu helper et plugin, ou pensais tu à une autre utilisation des plugins ?



Merci

Hors ligne

 

#4 06-11-2008 11:00:40

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: différence plugin // route

Bonjour squall6969,

Dans mon tuto, j'ai donné des exemples courants d'utilisation de helpers et plugins, mais NewSky a raison : un plugin peut aussi servir à mutualiser du code. Il n'y a pas de recette "universelle" pour l'utilisation des helpers et des plugins, il faut bien comprendre comment ça marche pour choisir dans quel cas on met tel ou tel code dans un plugin ou un helper.

Dans un site multilangue par exemple, la détection de la langue à partir de l'URL, de données en session ou autre se fait souvent dans un plugin.

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#5 06-11-2008 11:08:11

squall6969
Membre
Date d'inscription: 14-09-2008
Messages: 90

Re: différence plugin // route

Ok, merci pour vos réponse,

J'ai bien compris, je vais donc me pencher plus en profondeur dans le fonctionnement même de ces outils.

En tout cas je te félicite pour la clarté de ton tutorial big_smile

Autre petite question tant que j'y suis:
     Je note qu'en mettant en application directement les tutoriaux pointé par se site, concernant le modèle MVC, on obtient des url sans extension, y a t-il une utilité à rewrité ces url afin d'ajouter une extension de type .html ou .php ?



Merci

Hors ligne

 

#6 06-11-2008 11:12:01

NewSky
Membre
Date d'inscription: 17-12-2007
Messages: 79

Re: différence plugin // route

Je ne sais pas si on peut dire que j'ai "confondu" helper et plugin. Je débute aussi sur ZF ;-).
Mais effectivement, la différence flagrante entre les plugins et les helpers est bien le moment où ils sont appelés :
Plugins : avant et après l'instatiation/exécution du contrôleur frontal
Helpers : après le routage
Cela se voit précisément sur le diagramme de séquence proposé sur kitpages.fr.
Donc effectivement, seuls les plugins peuvent influencer le routage...

Une autre utilisation des plugins ?
Je sais pas si ce sera un bon exemple, mais j'ai développé un plugin qui permet de gérer l'appel du fichier robots.txt. Il génère ce fichier dynamiquement.
Pour ça, j'ai créer un plugin qui redéfini preDispatch. Si c'est robots.txt qui est demandé, je désactive les layouts et le view renderer et rend le contenue de robots.txt en text/plain. Je désactive aussi le plugin des erreur afin d'avoir un code 404 dans la réponse HTTP.
Peut-on dire que j'influence le routage dans cette situation ? L'utilisation d'un helper aurait été impossible vu que je n'utilise aucun contrôleur.
Est-ce une bonne utilisation des plugins ? Aurais-je pu faire autrement ?

Hors ligne

 

#7 06-11-2008 11:37:59

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: différence plugin // route

ça me paraît bien comme utilisation d'un plugin.

Tu aurais pu changer la conf apache pour que le robots.txt ne passe pas du tout par le ZF, mais à partir du moment où tu passes par le ZF, c'est pas bête d'intercepter cette requête dans un plugin.

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#8 06-11-2008 12:02:38

NewSky
Membre
Date d'inscription: 17-12-2007
Messages: 79

Re: différence plugin // route

Oui, bien sûr, mais le but était bien de pouvoir le gérer par le ZF! Un peu à la méthode de Wordpress qui, lorsque dans le backoff on choisi de rendre ou non le blog accessible aux moteurs de recherche, le robots.txt affiche les infos adéquats (ainsi que les balises métas...).
Donc j'ai voulu faire un peu dans cette optique...
Par contre, je posterais probablement mon code plus tard (je l'ai pas sous la main), mais quand je l'ai écrit, je me suis posé une question:

dans mon preDispatch, je fait le test suivant

Code:

if( 'robots.txt' === $controllerName)
{
     # faire désactivationLayoutsAndViewRenderer
     # Faire génération robots.txt
}

Est-ce la bonne façon de tester ?

Edit : pour ceux que ça intéresse, voici le code complet du plugin :

Code:

<?php 
/**
 * Gestion des appels à robots.txt par les robots/spiders
 * 
 * @version 0.0.1 - 07 Novembre 2008
 * @author Luc ALBERT
 * 
 * @see Zend_Controller_Plugin_Abstract
 *
 */
class Plugins_RobotsTxt extends Zend_Controller_Plugin_Abstract
{
   
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        if( 'robots.txt' === $request->getControllerName() )
        {
            $this->disableLayouts();
            
            // Configure les en-têtes
            $response = $this->getResponse();
            $response->setHeader( 'Content-Type', 'text/plain; utf-8' );
            
            $robotsTxt = "Sitemap: http://www.domaine.tld/sitemap.xml

            User-agent: *                 # Pour tous les robots
            Disallow: /images
            ";
            
            // Filtre les données
            $filter = new Filter_stripTabs();
            $robotsTxt = $filter->filter( $robotsTxt );
            
            $response->clearBody();
            $response->setBody( $robotsTxt );
        }
    }

   /**
     * Désactive les layout et le view renderer
     */
    public function disableLayouts()
    {
        /**
         * @see Zend_Layout
         */
        require_once 'Zend/Layout.php';
        if ( null !== ( $layout = Zend_Layout::getMvcInstance() ) ) {
            $layout->disableLayout();
        }
        
        // Désactive le rendu
        Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setNeverRender(true);
        
        // Désactive la gestion des erreurs (evite un code 404)
        Zend_Controller_Front::getInstance()->setParam( 'noErrorHandler',true );
    }
}

Dernière modification par NewSky (06-11-2008 13:33:35)

Hors ligne

 

#9 06-11-2008 13:32:16

Nikkau
Membre
Date d'inscription: 25-03-2008
Messages: 52

Re: différence plugin // route

A mes yeux non.

Ca marche uniquement dans le cas où le moteur de recherche cherche http://monsite.com/robots.txt, mais si ton URL est plus complexe, ça ne marche pas, le premier morceau de texte ne sera pas forcement le controller pour tout le monde.

D'ailleurs dans le cas le plus simple, quand le but n'est pas de tester ZF, il n'y a pas besoin d'une seule ligne de code si ton rewriting vérifie l'existence des fichiers avant de rerouter.

Hors ligne

 

#10 06-11-2008 13:38:23

NewSky
Membre
Date d'inscription: 17-12-2007
Messages: 79

Re: différence plugin // route

Nikkau a écrit:

Ca marche uniquement dans le cas où le moteur de recherche cherche http://monsite.com/robots.txt

Mais c'est normalisé, c'est comme ça que ça se passe non ? Lorsqu'un moteur passe sur ton site et qu'il veut récupérer le robots.txt, c'est la seule requête qu'il fait ?

Hors ligne

 

#11 06-11-2008 14:24:11

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: différence plugin // route

NewSky a écrit:

Est-ce une bonne utilisation des plugins ? Aurais-je pu faire autrement ?

A la 2e question, je configure une route static.
version fichier INI de la route

Code:

;Robots.txt
routes.robots_txt.type = "Zend_Controller_Router_Route_Static"
routes.robots_txt.route = "robots.txt"
routes.robots_txt.defaults.module = default
routes.robots_txt.defaults.controller = index
routes.robots_txt.defaults.action = robots

puis dans le controller

Code:

    public function robotsAction(){
        
        Zend_Layout::getMvcInstance ()->disableLayout();
        $this->_helper->viewRenderer->setNoRender();
        
        // Configure les en-têtes
        $response = $this->getResponse();
           $response->setHeader( 'Content-Type', 'text/plain; utf-8' );
    
        $robotsTxt = "Sitemap: http://www.domaine.tld/sitemap.xml
        User-agent: * # Pour tous les robots
        Disallow: /images
        ";
  
        $response->clearBody();
        $response->setBody( $robotsTxt );
    }

a+

Hors ligne

 

#12 06-11-2008 15:02:49

Nikkau
Membre
Date d'inscription: 25-03-2008
Messages: 52

Re: différence plugin // route

NewSky a écrit:

Mais c'est normalisé, c'est comme ça que ça se passe non ? Lorsqu'un moteur passe sur ton site et qu'il veut récupérer le robots.txt, c'est la seule requête qu'il fait ?

Oui, ça c'est normalisé, mais que le controller soit défini dans cette partie de l'URL non wink .

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages