Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 23-06-2009 11:50:44

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

[ZF 1.8]Bootstrap et Resources

Bonjour,

Je suis passé hier à ZF1.8 et j'ai donc du revoir pas mal ma conception. Notamment la manière de gérer la configuration. Toute ma sur-couche concernant ce point a du sauter, et l'adaptation aux nouveaux concepts de Zend n'est pas chose aisée.

Mais, après avoir planché un peu dessus hier, Zend_Application prend tout son sens. J'ai décidé de gérer toutes les resources via le fichier application.ini et de ré-écrire certaines classes d'initialisation de resouces proposées par Zend.

Je trouve le système assez convaincant et plutôt bien foutu, à deux ou trois détails près.

Je ne sais pas si j'ai pas encore assimilé le truc à 100% mais je rencontre quelques problèmes. Comme beaucoup de monde, je possède un plugin de controller pour gérer la langue.

Pour adapter cette chose là avec Zend_Application, je suis passé par application.ini pour configurer mes ressources "locale" et "translate", ex:

Code:

;******* Plugin resources
pluginPaths.Tight_Application_Resource = APPLICATION_PATH "/../library/Tight/Application/Resource"
; ...plus tard
;******* Resource local
resources.locale.default = "fr_FR"

;******* Resource translate
resources.translate.registry_key = "Zend_Translate"
resources.translate.adapter= "gettext"
resources.translate.options.scan = "directory"
resources.translate.data.directory = APPLICATION_PATH "/languages"
resources.translate.data.fileExt = ".mo"

Ensuite j'ai un plugin que j'ai nommé Bootstrap (Tight_Controller_Plugin_Bootstrap) dans lequel je boot les ressouces "Locale" et "Translate" après avoir testé certains paramètres, entre autres le paramètre de langue dans l'url.

Je boot également mes ressources "View" et "Layout" dans le plugin pour gérer les layouts et les vues différentes en fonction du module (toujours depuis les paramètres du fichier ini).

Ex:

Code:

class Tight_Controller_Plugin_Bootstrap extends Zend_Controller_Plugin_Abstract
{
    /**
     * routeShutDown action
     */
    public function routeShutdown(Zend_Controller_Request_Abstract $request)
    {
        // module demandé
        $module = $request->getModuleName();
 
        // récupère le "bootstrappeur"
        $bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
 
        // Bootstrap View
        $bootstrap->bootstrap('View');
        $view = $bootstrap->getResource('View');

        // paramètrage des path en fonction du module
        // $params = $view->$module;
        // $view->addBasePath($view->basePath)
        //      ->addHelperPath($view['helperPath'], $view['helperPathPrefix']);

        // Idem Bootstrap Layout
        $bootstrap->bootstrap('Layout');
        $layout = $bootstrap->getResource('Layout');

        // Bootstrap Locale
        $bootstrap->bootstrap('Locale');
        $locale = $bootstrap->getResource('Locale');
        
        $param_lang = $request->getParam('lang', null);        
        if (null !== $param_lang) {     
            $locale->setLocale($param_lang);
        }
        
        // Bootstrap Translate
        // $bootstrap->bootstrap('Translate');
        // $translate = $bootstrap->getResource('Translate');

        // @see Tight_View - permet d'accèder directement à la méthode _() dans la vue
        // $view->setTranslator($translate);
    }
}

Sauf que pour ça je suis obligé de "Bootstrapper" que le FrontController dans l'index pour pouvoir ensuite "Boostrapper" ce qui m'intéresse dans mon plugin. Mais du coup je suis obligé de "Bootstrapper" manuellement toutes les autres ressources (db par exemple).

De la même manière qu'on peut passer un array() des resources lors du Bootstrap, il serait intéressant de pouvoir passer un array() pour des exclusions (ce qui se trouve dans mon plugin par ex.).

De même, en utilisant cette méthode, je suis embêté pour initialiser l'autoloader pour l'application par défaut.

Code:

protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Default_',
            'basePath'  => dirname(__FILE__),
        ));
        
        return $autoloader;
    }

N'y-a-t'il pas moyen de passer ça dans le ini ? on peut indiquer le autoloaderNamespaces mais comment faire avec le basePath ? Obligé de rajouter le dossier "application" dans les include_path ?

Evidemment ça fonctionne en faisant dans l'index :

Code:

$application->getBootstrap()->bootstrap(array('FrontController', 'Autoloader'))
            ->run();

Mais bon but est de tout gérer via le fichier application.ini. J'ai réussi à tout configurer à travers le .ini, ce qui est assez génial avec les Bootstrap de resources et la méthodes getOptions(), mais reste deux ou trois petites choses gênantes.

Une idée sur une bonne méthode ?

Merci,
A+ benjamin

Dernière modification par Delprog (23-06-2009 11:54:28)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#2 23-06-2009 13:07:07

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [ZF 1.8]Bootstrap et Resources

En attendant, je laisse le Boostrap passer sur toutes les ressources, et dans mon plugin je récupère les ressources pour modifier leurs paramètres, mais je trouve ça moyen. J'espérais utiliser le système de Bootstrap de ressource et les classes Resource pour les paramétrer une bonne fois pour toute.

Sinon, étendre Zend_Application_Bootstrap_BootstrapAbstract, mais bof, la méthode bootstrap est finale, et même si c'est un alias vers _boostrap() qu'on peut surcharger, on ne peut pas ajouter de paramètres.
Je suis obligé d'utiliser le tableau de resources pour passer en plus un paramètre du genre 'exclude' => true.


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#3 03-07-2009 09:24:31

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: [ZF 1.8]Bootstrap et Resources

Je passe aussi en 1.8 et donc je casse toute ma partie config bootstrap et je nage dans la nouvelle approche.
Doit on mettre tout dans class bootstrap ou dans le fichier ini ? ou cela doit être réparti ce que je vois dans les tutoriaux mais comment et pourquoi mettre tel chose dans tel fichier ? je vois pas trop le critère de choix.
D'autre part qu'en est il du paramétrage des ressources tel que : session, du cache, auth ...
Si quelqu'un a déjà réaliser la migration qu'il hésite pas a mettre son code pour éclairer les neewbee comme moi.

Hors ligne

 

#4 03-07-2009 10:44:06

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [ZF 1.8]Bootstrap et Resources

Salut,

J'ai passé toute la config. dans le fichier .ini, mon boostrap principal est vide, je n'utilise que les Zend_Application_Resource_*.

En fait, pour faire simple, lors du bootstrap dans le fichier index.php, si tu ne passes pas de paramètres à la méthode, chaque resource est initialisée grâce à une classe Zend_Application_Resource_NomDeLaResource.

Ces classes existent déjà dans Zend pour la plupart des resources:
Db, Exception, Frontcontroller, Layout, Locale, Modules, Navigation, Router, Session, Translate et View.

Tu devrais aller voir le code de ces classes (Zend/Application/Resource/*) pour voir comment c'est foutu.

En gros, la classe récupère les options de la ressource dans le fichier application.ini via un

Code:

$options = $this->getOptions();

et gère la configuration de l'objet concerné. La méthode inscrit systématiquement (je crois) la ressource dans le registre avec par défaut comme clé une constante DEFAULT_REGISTRY_KEY présente dans la classe de resource. Cette valeur peut-être changée via l'option "registry_key" dans le fichier application.ini (resources.translate.registry_key = "tr" par ex.).

De mon côté j'ai ré-écrit certaines de ces classes de resource pour les initialiser d'une certaine façon.

De la même manière, j'ai écrit un plugin d'initialisation que j'ai appelé Tight_Controller_Plugin_Bootstrap, qui me sert à configurer certaines resources en fonction de certains paramètres (par ex. la langue pour Zend_Translate et Zend_Locale).

De cette manière, tu peux donc passer des paramètres personnalisés via le fichier application.ini, ré-écrire la classe Zend_Application_Resource_* correspondante et initialiser ton objet comme tu le souhaites, puisque tu récupéreras toutes tes options toujours via

Code:

$options = $this->getOptions();

.

Par exemple pour ma/mes vues j'ai :

Code:

;====== Resource view
resources.view[] =
resources.view.title = "Titre vue"
resources.view.encoding = "UTF-8"
resources.view.helperPathPrefix = "Tight_View_Helper_"
resources.view.helperPath = "Tight/View/Helper"
resources.view.params.pathStyles = "/public/styles"
resources.view.params.pathImages = "/public/images"
resources.view.params.pathScript = "/public/scripts"
resources.view.params.doctype = "XHTML1_STRICT"
resources.view.params.charset = "utf-8"

C'est pas très clair au début, mais une fois assimilé, c'est très intéressant. C'est difficile de tout expliquer correctement, si t'as des questions n'hésite pas.


A+ benjamin.

Dernière modification par Delprog (04-09-2009 14:09:21)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#5 03-07-2009 10:49:45

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: [ZF 1.8]Bootstrap et Resources

Merci je vais aller gratter du coté de ces ressources smile
Par contre dommage y'a rien pour la gestion du cache sad

Hors ligne

 

#6 03-07-2009 10:53:34

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [ZF 1.8]Bootstrap et Resources

Tu dois pouvoir créer une resource personnalisée pour ça, et le fonctionnement sera comme pour toutes les autres. Les paramètres dans application.ini et tu crées une classe Xxx_Application_Resource_Cache, c'est tout l'intérêt de la chose smile

Pour créer une resource personnalisée tu devrais regarder la doc.


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#7 03-07-2009 10:56:57

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: [ZF 1.8]Bootstrap et Resources

Oui je vais regarder ca de plus prêt dés que j'ai 2mn.

Dernière modification par Moimeme (03-07-2009 11:17:59)

Hors ligne

 

#8 03-07-2009 11:18:34

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: [ZF 1.8]Bootstrap et Resources

Pour prendre en compte tes resources.view.params tu as dérivé Zend_Application_Ressource_View ? ou c'est natif ? Si tu as dérivé tu peux nous montrer un bout de ton code pour y voir plus clair smile

Merci d'avance.

Hors ligne

 

#9 03-07-2009 11:57:58

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [ZF 1.8]Bootstrap et Resources

Certains paramètres sont pris en compte par le constructeur de l'objet Zend_View().

Si tu regardes les sources de Zend_Application_Resource_View, on a:

Code:

    public function getView()
    {
        if (null === $this->_view) {
            $this->_view = new Zend_View($this->getOptions());
        }
        return $this->_view;
    }

donc les "params" sont ceux qui sont attendu par Zend_View.

On ne peut pas étendre les classes de Resource, il faut étendre Zend_Application_Resource_ResourceAbstract, de mon côté j'ai quelquechose comme:

Code:

<?php
/**
 * Plugin resource view
 * 
 * @category Tight
 * @package Tight_Application
 * @author Benjamin Dulau
 */
class Tight_Application_Resource_View extends Zend_Application_Resource_ResourceAbstract
{
    protected $_view;
 
    /**
     * init view
     */ 
    public function init()
    {
        if (null === $this->_view) {
            // Options from Application.ini
            $options = $this->getOptions();
            $view = new Tight_View($options);
            if (!empty($options['params'])) {
                foreach ($options['params'] as $key => $value) {
                    $view->$key = $value;
                }
            }
 
            // ViewRenderer action helper
            $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
                'ViewRenderer'
            );
 
            // Save view object
            $viewRenderer->setView($view);
            $this->_view = $view;
        }        
        return $this->_view;
    }
}

N'hésite pas à regarder dans les sources de Zend, ça permet de comprendre pas mal de choses.


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#10 03-07-2009 12:07:07

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: [ZF 1.8]Bootstrap et Resources

Ou indique tu au moteur application d'utiliser Tight_Application_Resource_View à la place de Zend_Application_Resource_View pour tout ce qui est resources.view

Hors ligne

 

#11 03-07-2009 13:28:18

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [ZF 1.8]Bootstrap et Resources

Dans le fichier application.ini, j'ai deux choses:
L'include_path et le namespace pour ma librairie perso

Code:

;====== Library include_path
includePaths.library = APPLICATION_PATH "/../library"

;====== Autoload namespaces prefix
;autoloaderNamespaces.0 = "Default_"
autoloaderNamespaces.0 = "Tight_"

Puis plus loin:

Code:

;====== Plugin resources
pluginPaths.Tight_Application_Resource = APPLICATION_PATH "/../library/Tight/Application/Resource"

A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#12 03-07-2009 13:31:39

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: [ZF 1.8]Bootstrap et Resources

merci bcp.

Hors ligne

 

#13 04-09-2009 14:03:45

Eureka
Membre
Date d'inscription: 18-07-2009
Messages: 81

Re: [ZF 1.8]Bootstrap et Resources

Delprog a écrit:

On ne peut pas étendre les classes de Resource, il faut étendre Zend_Application_Resource_ResourceAbstract, de mon côté j'ai quelquechose comme:

Juste pour information pour ma part j'ai réussi à les étendre et ça fonctionne correctement pour ne surcharger qu'une partie d'un plugin de ressource existant.

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