Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 10-05-2009 12:15:39

pronorama
Membre
Date d'inscription: 24-09-2007
Messages: 17
Site web

[Bootstrap.php][1.8] Plugin/Helper/Resource

Bonjour,

Je vais migrer mon application de ZF 1.5 (sans bootsrap digne de ce nom, ni ressource, plugins ou helpers) vers FZ 1.8 en utilisant son nouveau modèle de bootstrap (boostrap.php+application.ini) et en utilisant au maximum les plugins et les helpers pour factoriser mon code.

Ma question porte sur la manière de déclarer tout ça et surtout à quel endroit.
Après quelques recherches (ici et sur le web), voici une solution à laquelle je suis arrivée.
Ca fonctionne bien mais je ne suis pas sûr que ce soit optimum et dans l'esprit de la 1.8 du framework.
Si vous avez des avis ou un retour d'expérience sur le sujet, je suis preneur et merci d'avance !

1) Enregistrement d'un plugin de controlleur
- Création d'une méthode dans "bootstrap.php" pour que mon plugin soit enregistré dès le démarrage de l'application
protected function _initControllersPlugins()
{
    $loader = new Zend_Loader_PluginLoader();
    $loader->addPrefixPath('My_ControllerPlugin', APPLICATION_PATH . '/global/controllers/plugins');
    $loader->load('Exemple');
    $this->bootstrap('frontController');
    $frontController = $this->getResource('frontController');
    $frontController->registerPlugin(new My_ControllerPlugin_Exemple());
}

- Dans le répertoire ".../global/controllers/plugins/" j'ai un fichier "Exemple.php" avec une classe "My_ControllerPlugin_Exemple" qui étend "Zend_Controller_Plugin_Abstract"


2) Enregistrement d'un helper d'action
- Création d'une méthode dans "bootstrap.php" pour que mon helper soit enregistré dès le démarrage de l'application
protected function _initControllersActionHelpers()
{
    $loader = new Zend_Loader_PluginLoader();
    $loader->addPrefixPath('My_ControllerActionHelper', APPLICATION_PATH . '/global/controllers/actionhelpers');
    $loader->load('Exemple');
    Zend_Controller_Action_HelperBroker::addHelper(new My_ControllerActionHelper_Exemple());       
}

- Dans le répertoire ".../global/controllers/actionshelpers/" j'ai un fichier "Exemple.php" avec une classe "My_ControllerActionHelper_Exemple" qui étend "Zend_Controller_Action_Helper_Abstract"


3) Déclaration d'un helper de vue
- Création d'une méthode dans "bootstrap.php" pour déclarer au framework où se trouvent mes helpers
protected function _initViewsHelpers()
{
    $this->bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView();
    $view->addHelperPath(APPLICATION_PATH . '/global/views/helpers', 'My_ViewHelper');
}

- Dans le répertoire ".../global/view/helpers/" j'ai un fichier "Exemple.php" avec une classe "My_ViewHelper_Exemple" qui étend "Zend_View_Helper_Abstract"


4) Déclaration/Initialisation d'une nouvelle ressource
- Ajout des lignes suivantes dans le fichier "application.ini"
pluginPaths.My_Resource = APPLICATION_PATH "/global/resources"
resource.XXX.<aaaa> = <val_a>
...
resource.XXX.<bbbb> = <val_b>

- Dans le répertoire ".../global/resources" j'ai un fichier "XXX.php" avec une classe "My_Resource_XXX" qui étend "Zend_Application_Resource_ResourceAbstract"
- Dans le fichier "bootstrap.php", je surcharge "__construct" pour être sûr que ma ressource "XXX" sera chargée en premier lors du bootstrapping :
public function __construct($application)
{
    parent::__construct($application);
    $this->bootstrap('XXX');
}

- J'aurais pu aussi l'initialiser dans une méthode du fichier "bootstrap.php"
protected function _initResources()
{
    $this->bootstrap('XXX');
}


Philippe

Dernière modification par pronorama (10-05-2009 15:25:49)

Hors ligne

 

#2 10-05-2009 16:44:08

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Bootstrap.php][1.8] Plugin/Helper/Resource

1/ Tu n'as pas regardé la doc, il montre comment chargé un plugin (sans paramètre de construction, ce qui semble être ton cas) via la resource du frontController

Code:

resources.frontcontroller.registerplugin.0  = My_ControllerPlugin_Exemple

2/ pareil, pas besoin de faire de code

Code:

resources.frontcontroller.actionhelperpaths.My_ControllerActionHelper_ = APPLICATION_PATH '/global/controllers/actionhelpers'

3/ Pareil

Code:

resources.view.helperPath.My_View_Helper = "My/View/Helper"

4/ relis la doc sur la façon de faire des dépendances sans a redéclarer __construct


----
Gruiiik !

Hors ligne

 

#3 10-05-2009 20:06:36

pronorama
Membre
Date d'inscription: 24-09-2007
Messages: 17
Site web

Re: [Bootstrap.php][1.8] Plugin/Helper/Resource

1) je n'ai pas trouvé dans la doc mais effectivement ça marche
Par contre, la ligne seule ne suffit pas
J'ai dû en ajouter 2 :
autoloaderNamespaces.0 = "My_"
includePaths.library = APPLICATION_PATH "/global/controllers/actionhelpers"

et sous le répertoire "actionhelpers", j'ai dû créer une arbroescence ".../actionhelpers/My/ControllerPlugin"

2) ok mais cela permet uniquement de déclarer le chemin
Mon helper "My_ControllerActionHelper_Exemple" n'est pas enregistré dès le départ

3) ok

4) pas compris

Hors ligne

 

#4 11-05-2009 00:01:05

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Bootstrap.php][1.8] Plugin/Helper/Resource

Normalement, tu as justes à déclarer la base dans ton include path, je prends un exemple
si tu as tes lib dans /lib/My/
Il faut donc mettre /lib dans ton include path et déclarer le namespace My_
ZF sera capable de chargé tout ce qu'il y a dans My et ses sous-répertoire :
/lib/My/Controller/Action.php par exemple

2/ tu as besoin de le déclarer dès le départ pour quel raison ?
Normalement, si tu t'en sert comme classe 'normal' et pas dans une action, la déclaration du namespace (en 1/) devrait suffire.

4/ je l'ai expliqué dans mon autre poste sur le sujet smile

Bon courage


----
Gruiiik !

Hors ligne

 

#5 11-05-2009 23:22:25

pronorama
Membre
Date d'inscription: 24-09-2007
Messages: 17
Site web

Re: [Bootstrap.php][1.8] Plugin/Helper/Resource

pour le point 2)

D'après ce que j'ai compris :
- si seul le chemin vers les helpers d'action est déclaré, chaque helper ne sera exécuté que si on s'en sert explicitement dans les actions : dans ce cas, seule la fonction "init" est appelée automatiquement par le ZF (en plus de la fonction spécfiquement ecrite pour le helper bien entendu)
- par contre, si le helper d'action est "déclaré" (enregistré), sa fonction "preDispatch" sera automatiquement appelée avant que le code de chaque action soit exécuté. Cela autorise à mettre certaines choses automatiquement et systématiquement à dispo des actions, sans avoir à appeler le helper explicitement dans les actions.

Ca semble être 2 façons d'utiliser les helpers d'action
Dans le 2ème cas, ça ressemble plus à un plugin qu'à un helper ?

Sinon pour répondre à ta question 'tu as besoin de le déclarer dès le départ pour quelle raison", et bien pour l'instant je n'ai pas de réponse à te donner car j'en suite juste à découvrir et à expérimenter les différentes possibilités du ZF 1.8

Mais je suis peut-être à côté de la plaque. Pas évident de bien maitriser les notions de helpers/plugins, à quel niveau il y en a (controlleurs, actions, views, ...), où ça se déclare, où ça se paramètre, où ça s'utilise et comment,  les différents cas d'utilisation, ... :-)

Si tu connais un didacticiel exhaustif sur le sujet et avec des exemples concrets, je suis preneur !

A+

Philippe

Hors ligne

 

#6 12-05-2009 09:07:36

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Bootstrap.php][1.8] Plugin/Helper/Resource

2)
Pour moi, un helper, c'est une fonction 'supplémentaire' offerte d'accès à une classe. Un peu comme des plugins de classe
Le but des helpers d'action étant donc d'offrir des fonctionnalités aux classes d'action
Pareil pour les vues (on a les helpers de vues).
Un plugin est un processus qui peut intervenir à un ou plusieurs moment du déroulement de la requète.

Tu as donc raison dans ce que tu dis. Mais personnellement, je ne comprends pas l'interet du preDispatch dans les helper d'action ; d'ailleurs, il me semble qu'aucun helper d'action fourni avec le ZF utilise le predispatch. Par contre, la méthode postDispatch est appelé quelque soit la méthode utilisé.

Pour les exemples complet, rien ne vaut qu'étudier les helpers déjà fourni (viewrenderer, flashmessenger, ...)


----
Gruiiik !

Hors ligne

 

#7 17-05-2009 12:17:11

pronorama
Membre
Date d'inscription: 24-09-2007
Messages: 17
Site web

Re: [Bootstrap.php][1.8] Plugin/Helper/Resource

Salut,

Effectivement, rien ne vaut la lecture des sources du ZF pour comprendre son fonctionnement.
Donc pour résumé, toutes mes ressources sont maintenant définies dans mon fichier "application.ini" (mon fichier bootstrap.php est quasiment vide !).
J'ai également créé mes propres ressources avec pour chacune un plugin de ressource associé.

Je suis maintenant confronté au problème suivant : comment récupérer une ressource particulière dans mon application. La doc indique de passer par le paramètre "bootstrap" du frontcontrolleur, mais l'exemple donné ne fonctionne que dans un controller :

class FooController extends Zend_Controller_Action
{   
    public function init()   
    {       
        $bootstrap = $this->getInvokeArg('bootstrap');
        $view = $bootstrap->getResource('view');
        // ...   
    }
}

Ailleurs (par exemple dans un plugin de controlleur), la méthode getInvokeArg n'existe pas.

Pour simplifier (et avoir une méthode unifiée), j'utilise le code suivant.
Il semble fonctionner partout où on se trouve dans l'application (action, vue, layout, plugin, helper d'action ou de vue, classes métiers, ...). Qu'en penses-tu ?

// ...
$front = Zend_Controller_Front::getInstance();
$bootstrap = $front->getParam('bootstrap');
$toto = $bootstrap->getResource('toto'); // récupération de la ressource 'toto'
// ...


Philippe

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