Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 02-10-2008 05:25:58

BeRoots
Membre
Date d'inscription: 15-05-2008
Messages: 79

set_include_path et ZF

Salut la compagnie smile

J'ai une question concernant set_include_path()... Cette fonction est bien une fonction propre à PHP hein?

Pour une utilisation au bootstrap (controleur frontale), je conçoit bien qu'il faille mette le chemin vers le framework ZF. Mais pourquoi avoir Application/Models/ ?

Code:

/**
* On redéfinit les chemins d'inclusions pour le framework
*/
set_include_path('.'
    . PATH_SEPARATOR . '../path/to/zf/'
    . PATH_SEPARATOR . 'Application/Models/'
    . PATH_SEPARATOR . get_include_path());

Si quelqu'un peut m'étayer un peu le problème de set_include_path() pour une utilisation de ZF et me confirmer qu'il faut bien inclure Application/Models/ wink

merci d'avance smile

Dernière modification par BeRoots (03-10-2008 13:40:00)


wink Non au language SMS sur nos forums wink

Hors ligne

 

#2 02-10-2008 09:17:43

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

Re: set_include_path et ZF

Le set_include_path indique à PHP (oui, c'est bien une fonction PHP) que quand tu fais include ("toto/titi.php"), il va chercher le "toto/titi.php" dans tous les répertoires définis dans le include_path.

Si en général avec le ZF, on inclue le répertoire modèle, c'est parce qu'on a mis dans ce répertoire des fonctions que l'on veut atteindre simplement avec un include("Company/Project/MyClass.php")  (ou un Zend_Loader::loadClass("Company_Project_MyClass")) sans se demander où on a mis les classes de son modèle dans l'arborescence.

C'est juste un truc pratique qu'on fait souvent, mais ça n'est absolument pas imposé par le ZF. Si tu mets ton modèle ailleurs (voire si tu codes sans modèle), tu n'as pas à ajouter ce répertoire dans le include_path.

A+, Philippe


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

Hors ligne

 

#3 02-10-2008 15:49:15

BeRoots
Membre
Date d'inscription: 15-05-2008
Messages: 79

Re: set_include_path et ZF

OK merci smile
une reponse claire, comme je les aiment wink


wink Non au language SMS sur nos forums wink

Hors ligne

 

#4 02-10-2008 19:02:58

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: set_include_path et ZF

Je rajoute une précision : ne faites pas comme Zend Studio : placez get_include_path() en *premier*, et placez votre ZF en *premier* dans l'include_path de PHP.

Lorsqu'on demande un fichier, PHP cherche dans tous les dossiers de l'include_path en commençant par le premier.
Etant donné qu'énormément de fichiers proviennent du ZF, veillez bien à placer celui-ci en premier dans la pile, de manière à accélérer (et ca peut être significatif sur de la haute charge) l'application

Hors ligne

 

#5 02-10-2008 19:25:33

BeRoots
Membre
Date d'inscription: 15-05-2008
Messages: 79

Re: set_include_path et ZF

et si j'utilise une arborescence modulaire comme suit:

.
¦- application
¦  ¦- admin
¦  ¦  ¦- controllers
¦  ¦  ¦  `- MembersController.php
¦  ¦  ¦- models
¦  ¦  ¦  `- Members.php
¦  ¦  `- views
¦  ¦     `- scripts
¦  ¦        `- members
¦  ¦           `- index.phtml
¦  `- default
¦     ¦- controllers
¦     ¦  ¦- IndexController.php
¦     ¦  `- ListingController.php
¦     ¦- models
¦     ¦  ¦- Index.php
¦     ¦  `- Listing.php
¦     `- views
¦        `- scripts
¦           ¦- index
¦           ¦  `- index.phtml
¦           `- member
¦              `- index.phtml   
¦- library
¦  `- Zend
¦     `- ...
¦- public
¦  ¦- images
¦  ¦  `- ...
¦  ¦- scripts
¦  ¦  `- ... (js)
¦  `- styles
¦     `- ... (css)
`- index.php

1°) est ce que cela m'oblige à preciser les chemins de tout mes model pour chaque module ou n'est il pas mieux de mettre dand l'include_path uniquement /application/ ?

2°) et pour ton conseil tu preconise ceci en faite ?

Code:

/**
* On redéfinit les chemins d'inclusions pour le framework
*/
set_include_path('./path/to/Zend/.'
    . PATH_SEPARATOR . '.'
    . PATH_SEPARATOR . get_include_path()
);

ou alors

Code:

/**
* On redéfinit les chemins d'inclusions pour le framework
*/
set_include_path('.'
    . PATH_SEPARATOR . './path/to/zend/'
    . PATH_SEPARATOR . get_include_path()
);

Merci d'avance pour vos réponses wink


wink Non au language SMS sur nos forums wink

Hors ligne

 

#6 02-10-2008 20:30:28

gauthier
Membre
Date d'inscription: 30-09-2008
Messages: 116
Site web

Re: set_include_path et ZF

Salut BeRoots,

si tu tiens absolument à utiliser un autoloader, voila ce que tu peux faire d'assez confortable, et en même temps pas trop calamiteux du point de vue des performances :

1] ajouter tous les dossiers "models" à l'include_path

Code:

set_include_path(
    '.' 
    . PATH_SEPARATOR    
    . '/peu/importe/library/' 
    . PATH_SEPARATOR 
    . '../application/admin/models/'
    . PATH_SEPARATOR
    . '../application/default/models/'
    . PATH_SEPARATOR 
    . get_include_path()
);

2] enregistrer un autoloader

Code:

function modelAutoloader($className) {
    require_once "$className.php";
}
spl_autoload_register('modelAutoLoader');

And voila smile La fonction spl_autoload_register() va s'ajouter à tout autre autoloader éventuellement enregistré, et aller chercher className.php dans tous les chemins configurés dans l'include_path.

Précision : sous windows, il est possible de se contenter de spl_autoload_register();, auquel cas la spl utilisera sa propre fonction d'autoload, quasi identique à la mienne, à ceci près qu'elle applique l'équivalent d'un strtolower() sur le nom de la classe, et qu'elle cherche également classname.inc. Sous Linux, la suppression des majuscules pose un problème, puisque le système de fichier fait la différence entre clasName.php et classname.php.

Enfin, je précise que ma fonction autoload manque de certaines choses, à commencer bien sûr par une vérification de l'existence du fichier, et qu'il serait également possible de faire des tests peut-être plus performants que require_once() pour éviter le chargement à répétition de classe identiques.

Mais pour de nombreuses raisons, qu'il me semble hors de propos de détailler ici, je pense qu'un autoloader peut être utilisé tel que en développement, mais qu'en prod, si on veut vraiment assurer un max de performances, mieux vaut s'en passer !

Dernière modification par gauthier (02-10-2008 20:31:07)


Consultant Zend Technologies // Blog perso : Logiciel libre et développement web -- http://freeblogware.org

Hors ligne

 

#7 02-10-2008 21:43:01

ohoareau
Nouveau membre
Lieu: Paris
Date d'inscription: 02-10-2008
Messages: 1
Site web

Re: set_include_path et ZF

Et pourquoi ne pas utiliser la fonctionnalité autoload de ZF ?

Code:

require 'Zend/Loader.php';
Zend_Loader::registerAutoload();

qui est équivalent à écrire la fonction :

Code:

function __autoload($className)
{
    require_once str_replace('_',DIRECTORY_SEPARATOR,$className).'.php';
}

Quels sont vos usages à tous ?


Olivier Hoareau
http://www.phppro.fr

Hors ligne

 

#8 02-10-2008 21:50:20

gauthier
Membre
Date d'inscription: 30-09-2008
Messages: 116
Site web

Re: set_include_path et ZF

Bonsoir Olivier,

Et pourquoi ne pas utiliser la fonctionnalité autoload de ZF ? [...] qui est équivalent à écrire la fonction :

Tout simplement parce que ce n'est pas le cas smile Si tu consultes le source de Zend_Loader, tu verras que la méthode autoload qui s'y rattache est sensiblement plus complexe que celle que tu proposes.

L'approche que je proposais a pour avantage d'être absolument minimale en termes de ressources consommées, même si je suis bien d'accord pour dire que Zend_Loader::registerAutoload() aurait les mêmes avantages, certains contrôles en plus smile

Résumons la situation :

- si on n'a pas de préoccupations particulière du point de vue des performances ==> Zend_Loader
- si on veut éviter le pire ==> spl_register_autoload() avec un autolaod maison "light"
- si on chasse les millisecondes ==> require() sur chaque classe (on évite require_once()... quitte à faire un if(!class_exists()) quand on a un doute...

Mais soyons clairs : la problématique de performances, du moins à cette échelle, ne concerne que très peu d'utilisateurs ! A moins bien sûr que vous ne fassiez tourner votre serveur web sur un PC en bois fabriqué entre la guerre de 70 et celle de 14 smile


Consultant Zend Technologies // Blog perso : Logiciel libre et développement web -- http://freeblogware.org

Hors ligne

 

#9 03-10-2008 13:39:35

BeRoots
Membre
Date d'inscription: 15-05-2008
Messages: 79

Re: set_include_path et ZF

ok merci pour cela... Ma question était un peu differente quand même et c'est pas tout a fait cette optimisation que je souhaitai voir confirmé tongue

1°) enfin, moi ce que je voudrai déjà savoir, c'est si je place le /path_to_ZF/ en tout premier dans set_include_path ? (Cf. mon prcedent post)

2°) et pour l'autoload, je veut bien, mais c'est pas un peu hors sujet là ? set_include_path(), c'est pour de l'inclusion, pas du chargemnt de class nan ? (sinon merci de donner un exemple de methode avc autoload)

Merci d'avance wink


wink Non au language SMS sur nos forums wink

Hors ligne

 

#10 03-10-2008 14:07:22

gauthier
Membre
Date d'inscription: 30-09-2008
Messages: 116
Site web

Re: set_include_path et ZF

Désolé pour le hors-sujet smile

la première question 1), si je ne me trompe pas d'interprétation cette fois smile, c'est la première version qui convient pour suivre le conseil de Julien, à savoir placer le path vers ZF en tout premier de l'include_path. Si tu mets d'abord ".", comme dans ton second exemple, voici ce qui se passe :

Code:

// lorsque tu fais ça :
require_once 'Zend/Exception.php';

// php va chercher d'abord à faire :
require_once './Zend/Exception.php';
// ce qui ne fonctionnera pas

// il tentera alors ça ensuite :
require_once '/path/to/ZF/library/Zend/Exception.php';

// et ça ce sera bon

Conclusion : si tu place x chemins avant celui de ZF/library dans l'include_path, PHP devra faire au total x+1 tentatives d'inclusion. En le plaçant en premier, il ne fera qu'une tentative, directement fructueuse
pour la question 2), je ne pense pas être si hors-sujet, dans la mesure ou les fonctions d'autoload s'appuient sur la valeur configurée dans l'include_path, et que d'autre part, l'include_path sert principalement, au moins dans ce contexte, à charger des définitions de classes smile

Pour la seconde question, disons que j'ai débordé un peu dans l'enthousiasme du moment wink En espérant avoir cette fois répondu à ta question. Si ce n'est toujours pas le cas, n'hésites pas à me relancer !


Consultant Zend Technologies // Blog perso : Logiciel libre et développement web -- http://freeblogware.org

Hors ligne

 

#11 03-10-2008 18:04:22

ManuB
Membre
Lieu: Auxerre
Date d'inscription: 17-10-2007
Messages: 49

Re: set_include_path et ZF

gauthier a écrit:

Salut BeRoots,

si tu tiens absolument à utiliser un autoloader, voila ce que tu peux faire d'assez confortable, et en même temps pas trop calamiteux du point de vue des performances :

1] ajouter tous les dossiers "models" à l'include_path

Code:

set_include_path(
    '.' 
    . PATH_SEPARATOR    
    . '/peu/importe/library/' 
    . PATH_SEPARATOR 
    . '../application/admin/models/'
    . PATH_SEPARATOR
    . '../application/default/models/'
    . PATH_SEPARATOR 
    . get_include_path()
);

2] enregistrer un autoloader

Code:

function modelAutoloader($className) {
    require_once "$className.php";
}
spl_autoload_register('modelAutoLoader');

And voila smile La fonction spl_autoload_register() va s'ajouter à tout autre autoloader éventuellement enregistré, et aller chercher className.php dans tous les chemins configurés dans l'include_path.

Précision : sous windows, il est possible de se contenter de spl_autoload_register();, auquel cas la spl utilisera sa propre fonction d'autoload, quasi identique à la mienne, à ceci près qu'elle applique l'équivalent d'un strtolower() sur le nom de la classe, et qu'elle cherche également classname.inc. Sous Linux, la suppression des majuscules pose un problème, puisque le système de fichier fait la différence entre clasName.php et classname.php.

Enfin, je précise que ma fonction autoload manque de certaines choses, à commencer bien sûr par une vérification de l'existence du fichier, et qu'il serait également possible de faire des tests peut-être plus performants que require_once() pour éviter le chargement à répétition de classe identiques.

Mais pour de nombreuses raisons, qu'il me semble hors de propos de détailler ici, je pense qu'un autoloader peut être utilisé tel que en développement, mais qu'en prod, si on veut vraiment assurer un max de performances, mieux vaut s'en passer !

Pour mon cas..... Mes modèles étant à l'interieur de mes modules..... (1 module = 1 application dans un portail...)

J'ai un plugin en dispatchLoopStartup qui modifie l'include path avec le chemein des modèles selon le module ou je me trouve.....

Hors ligne

 

#12 04-10-2008 22:34:51

BeRoots
Membre
Date d'inscription: 15-05-2008
Messages: 79

Re: set_include_path et ZF

ManuB a écrit:

J'ai un plugin en dispatchLoopStartup qui modifie l'include path avec le chemein des modèles selon le module ou je me trouve.....

pourrai t'on avoir un aperçu de ton plugin en dispatchLoopStartup ?
Merci d'avance wink


wink Non au language SMS sur nos forums wink

Hors ligne

 

#13 05-10-2008 09:44:21

ManuB
Membre
Lieu: Auxerre
Date d'inscription: 17-10-2007
Messages: 49

Re: set_include_path et ZF

Je ne me souviens qui m'a soumis l'idée de faire comme çà, philippe ici même ou Julien chez Anaska.... Ou peut être moi tout court....

Je n'ai pas le code sous la main aujourd'hui... Mais de tête çà doit être çà :

Mon Plugin :

Code:

 
class MSAB_Controller_Plugin_PathModels extends Zend_Controller_Plugin_Abstract
{
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
    {
        
        set_include_path('./application/' . $request->getModuleName(). '/models/.'
            . PATH_SEPARATOR . '.'
            .PATH_SEPARATOR . get_include_path()
        );

    }
}

Dans le bootstrap :

Code:

$front->registerPlugin(new MSAB_Controller_Plugin_PathModels ());

Dernière modification par ManuB (05-10-2008 09:45:30)

Hors ligne

 

#14 05-10-2008 14:14:25

gauthier
Membre
Date d'inscription: 30-09-2008
Messages: 116
Site web

Re: set_include_path et ZF

Salut Manu,

cette approche, via un plugin, est vraiment intéressante, mais je lui vois tout de même une limitation : quid des modèles génériques (users typiquement, ou encore préférences, etc.) ainsi que des situations où un module doit faire appel à des modèles issus d'autrs modules ?

Cela demande de gérer du cas par cas, ce qui ne semble pas très confortable.

Comment gères-tu ces situations ?


Consultant Zend Technologies // Blog perso : Logiciel libre et développement web -- http://freeblogware.org

Hors ligne

 

#15 05-10-2008 16:05:57

ManuB
Membre
Lieu: Auxerre
Date d'inscription: 17-10-2007
Messages: 49

Re: set_include_path et ZF

Dans mon cas je ne gère pas de base utilisateurs...

Bref je n'ai pour l'instant pas de modèle générique.... Un module étant une application bien distincte des autres sans adhérences entre elles.

La seule chose commune est l'authentification sur mon portail basé sur mon annuaire LDAP ce qui m'évite de gérer un nouvel identifiant et un mot de passe pour l'authenfication et que mes utilisateurs est un nouveau mot de passe a se souvenir.... (Je les voient bien me dire ENCORE !!!)

Je précise que je suis sur un intranet...

Je test donc l'entrée du portail l'appartenance a des groupes pour les accès aux applications et aux droits sur celles ci...

Cette solution n'empêche pas de définir un répertoire commun dans l'include path pour les modèles générique directement dans le boostrap...

Ma solution n'est peut être pas parfaite mais elle réponds a mon besoin... et peut être a d'autres

Dernière modification par ManuB (06-10-2008 09:51:02)

Hors ligne

 

#16 05-10-2008 16:12:18

gauthier
Membre
Date d'inscription: 30-09-2008
Messages: 116
Site web

Re: set_include_path et ZF

si tu considères un module comme une application à part entière, et qu'elles ne sont pas susceptibles de partager de modèles, en ce cas, oui c'est nickel smile


Consultant Zend Technologies // Blog perso : Logiciel libre et développement web -- http://freeblogware.org

Hors ligne

 

#17 05-10-2008 16:27:06

ManuB
Membre
Lieu: Auxerre
Date d'inscription: 17-10-2007
Messages: 49

Re: set_include_path et ZF

C'est exactement le cas...

Hors ligne

 

#18 05-10-2008 22:05:46

BeRoots
Membre
Date d'inscription: 15-05-2008
Messages: 79

Re: set_include_path et ZF

Dernière petite question avant adoption du bébé smile

Si ton bootstrap tu appel un plugin... Ok... Mais pour cela tu doit avoir un définition via set_include_path() pour le ZF avant, nan?

Genre:

Code:

/**
* On redéfinit les chemins d'inclusions pour le framework
*/
set_include_path('.'
    . PATH_SEPARATOR . '../0_lib/php/'
    . PATH_SEPARATOR . get_include_path()
);


/**
* Inclusion du loader et appel de la méthode d'auto-chargement de classe
*/
require_once "Zend/Loader.php";
Zend_Loader::registerAutoload();


/**
* instanciation et paramètrage de Zend_Controller_Front (contrôleur frontale)
*/
$front = Zend_Controller_Front::getInstance();
$front->throwExceptions($registry->config->settings->throwexeptions); // true en developpement et false en production
$front->setControllerDirectory(array(
    'default' => 'Application/default/controllers',
    'admin'   => 'Application/admin/controllers',
));

// .... puis enfin on appel le plugin
$front->registerPlugin(new MSAB_Controller_Plugin_PathModels ());

// suite du bootstrap...

C'est ça ?

Merci d'avance wink


wink Non au language SMS sur nos forums wink

Hors ligne

 

#19 06-10-2008 09:48:27

ManuB
Membre
Lieu: Auxerre
Date d'inscription: 17-10-2007
Messages: 49

Re: set_include_path et ZF

Pour répondre à ta question, oui je redéfini déjà le include path pour zf au niveau du bootstrap

Donc je te mets le code complet de mon plugin situé dans le répertoire library/MSAB/Controller/Plugin/Config.php

Code:

<?php
/**
 * MSA DE BOURGOGNE
 * 
 * @category       MSAB
 * @package        MSAB_Controller
 * @subpackage Plugins
 * @author         E. BOUGEROLLE <bougerolle.emmanuel@bourgogne.msa.fr>
 */

/**
 * Plugin de configuration des modules
 * 
 * @category    MSAB
 * @package        MSAB_Controller
 * @subpackage Plugins
 */
class MSAB_Controller_Plugin_Config extends Zend_Controller_Plugin_Abstract
{    
    /**
     * Chargement de la configuration avant la boucle de dispatching
     */
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
    {           
        $registry = Zend_Registry::getInstance();        
        $appDir = $registry->get('appDir');
        $module = $request->getModuleName();
        
        // Ajoute le répertoire des modèles du module dans le path
        set_include_path(
            get_include_path(). PATH_SEPARATOR . $appDir . 'modules\\'.$module.'\\models'
        );        
       
        // Charge la config spécifique du module 
        $config   = new Zend_Config_Ini('config.ini',$module);
        $registry->set('config',$config);
    }
}

Le bootstrap qui n'est pas parfait, je bricole par dessus depuis que j'ai démarrer ZF, mais je suis en train de tout réécrire :

Code:

<?php
/**
 * MSA DE BOURGOGNE
 * 
 * BootStrap de l'application
 * 
 * @category    MSAB
 * @package        MSAB
 * @author        E. BOUGEROLLE <bougerolle.emmanuel@bourgogne.msa.fr>
 */

/**
* Configuration PHP
*/
error_reporting(E_ALL | E_STRICT);

date_default_timezone_set('Europe/Paris');

$appDir = realpath(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'application' . 
DIRECTORY_SEPARATOR;

set_include_path(get_include_path() . PATH_SEPARATOR 
. $appDir . PATH_SEPARATOR 
. $appDir . 'config' . PATH_SEPARATOR 
. $appDir . 'library' . PATH_SEPARATOR 
. $appDir . 'modules' . PATH_SEPARATOR 
. $appDir . 'logs');

/**
 * Chargement du loader et activation de l'autoload
 */
require_once 'Zend/Loader.php';
spl_autoload_register(array('Zend_Loader' , 'autoload'));

/**
 * Chargement de la configuration générale
 */
$config = new Zend_Config_Ini('config.ini', 'app');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);
$registry->set('appDir', $appDir);

/**
 * Setup database
 */

try {
    $db = Zend_Db::factory($config->db);
    Zend_Db_Table::setDefaultAdapter($db);
    $registry->set('db', $db);
    $db->getConnection();
} catch (Zend_Db_Adapter_Exception $e) {
    exit($e->getMessage());
} catch (Zend_Db_Exception $e) {
    exit($e->getMessage());
}

/**
 * Setup Controller
 */
Zend_Controller_Action_HelperBroker::addPrefix('MSAB_Controller_Action_Helpers');
$front = Zend_Controller_Front::getInstance();
$front->addModuleDirectory($appDir . 'modules');
$front->registerPlugin(new MSAB_Controller_Plugin_Auth());
$front->registerPlugin(new MSAB_Controller_Plugin_Config());
$front->throwExceptions(false);
$front->setBaseUrl("/webmsab");

//Options Layout MVC; Ignorée si pas MVC
$options = array('layout' => 'layout' , 'layoutPath' => $appDir . '/layouts' , 'contentKey' => 'content');
Zend_Layout::startMvc($options);

try{
    $front->dispatch();    
} catch (Exception $e) {
    exit($e->getMessage());
}

En espérant que çà t'aide...

Hors ligne

 

#20 06-10-2008 23:40:26

BeRoots
Membre
Date d'inscription: 15-05-2008
Messages: 79

Re: set_include_path et ZF

c'est assez bien vue... je pense l'adopté smile

par contre croit tu qu'il soit possible d'en faire de même pour la définition des chemin vers les controlleurs de chaque module ?

Code:

$front->setControllerDirectory(array(
    'default' => 'Application/Default/controllers',
    'admin'   => 'Application/Admin/controllers',
    'admin'   => 'Application/News/controllers',
    'admin'   => 'Application/Forum/controllers',
    'admin'   => 'Application/Blog/controllers',
    'admin'   => 'Application/TarteAuxMirtilles/controllers',
));

je ne sait pas si le singleton $front est accessible depuis un plugin donc au cas où, merci de précisé wink

sinon on pourrai peut être faire ainsi mais sans plugin:

Code:

// on définit le module demander
$module = $request->getModuleName();

$front->setControllerDirectory(array(
    $module => 'Application/'.$module.'/controllers',
));

Qu'en pensez vous ? mieux en module ou au bootstrap ?
perso je prefererrai en module avec un scan de dossier pour en plus definir tout les modules disponible...


wink Non au language SMS sur nos forums wink

Hors ligne

 

#21 07-10-2008 07:53:02

ManuB
Membre
Lieu: Auxerre
Date d'inscription: 17-10-2007
Messages: 49

Re: set_include_path et ZF

BeRoots a écrit:

c'est assez bien vue... je pense l'adopté smile

par contre croit tu qu'il soit possible d'en faire de même pour la définition des chemin vers les controlleurs de chaque module ?

Code:

$front->setControllerDirectory(array(
    'default' => 'Application/Default/controllers',
    'admin'   => 'Application/Admin/controllers',
    'admin'   => 'Application/News/controllers',
    'admin'   => 'Application/Forum/controllers',
    'admin'   => 'Application/Blog/controllers',
    'admin'   => 'Application/TarteAuxMirtilles/controllers',
));

je ne sait pas si le singleton $front est accessible depuis un plugin donc au cas où, merci de précisé wink

sinon on pourrai peut être faire ainsi mais sans plugin:

Code:

// on définit le module demander
$module = $request->getModuleName();

$front->setControllerDirectory(array(
    $module => 'Application/'.$module.'/controllers',
));

Qu'en pensez vous ? mieux en module ou au bootstrap ?
perso je prefererrai en module avec un scan de dossier pour en plus definir tout les modules disponible...

C'est possible je pense qu'il doit etre accessible par peut importe ou tu te situe... :

Code:

$front = Zend_Controller_Front::getInstance();

mais le plus simple est de regrouper tes modules au sein d'un même dossier et de le définir dans ton bootstrap. Ce que je fais....

Code:

$appDir = realpath(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'application' . 
DIRECTORY_SEPARATOR;


$front->addModuleDirectory($appDir . 'modules');

Dernière modification par ManuB (07-10-2008 07:54:36)

Hors ligne

 

#22 07-10-2008 14:07:13

gchau
Membre
Date d'inscription: 15-05-2008
Messages: 17

Re: set_include_path et ZF

Bonjour,
Comme ce thread revient sur la question du bootstrap qui m’intéresse pas mal j’en profite pour mettre au propre mes idées sur la question même si ce ne sont pas des réponses précises à des questions de ce thread  mais en espérant intéresser quelqu’un .   
     
Pour ma part je pense que l’initialisation ne doit pas nécessairement se faire en une seule fois comme c’est le cas si on utilise uniquement un script index.php.    Mais je pense qu’un plugin du type de l’Initializer  n’a pas moins le caractère monolithique d’un boot de type index.php : à l’exécution dans les 2 cas on configure tout ou rien  et en plus il est moins complet car il faut bien que l’enregistrement du plugin Initializer soit faite à l’extérieur du plugin lui-même. Autrement dit on se trouve obligé de configurer l’objet front controlleur en 2 endroits différents alors que centraliser la configuration de ce qui est commun à tous les traitements me
parait aller de soi.
De plus l’initialisation complète d’une application ne me parait pas rentrer naturellement dans les attributions d’un plugin en effet d’après ce que j’ai pu comprendre , les plugins servent essentiellement  à ajouter de la logique à des étapes bien précises de l’exécution du front  (par ex : sécurisation des accés via les acl, interception des erreurs, interception des requêtes, etc..)  or la mission du bootstrap c’est d’une certaine façon  d’initialiser le  processus dirigé par le front controller.     

Il existe une troisième possibilité que j’ai évoquée dans un précédent post sur un autre thread (
http://www.z-f.fr/forum/viewtopic.php?id=1855&p=1) qui est d’utiliser une classe bien spécifique (cad  non prévue actuellement par ZF à ma connaissance)  pour localiser et initialiser les ressources nécessaires aux différents traitements  possibles d’une appli.  On voit fréquemment cette solution sous la forme d’une classe Bootstrap.php mais perso le nom Initializer me va aussi très bien…
Le but de cette classe est comme pour index.php de regrouper en un seul endroit la configuration de tous les
ressources que sont les objets, instances de classes ZF, qui sont utiles à une appli.
La différence c’est qu’à chaque ressource (ou groupe de ressources , j’y reviendrai)  on associe une méthode (statique ou non j’y reviendrai) correspondant elle-même un fichier de configuration  (ini ou xml j’y reviendrai).

L’intérêt c’est d’une part la lisibilité et d’autre part la possibilité d’une configuration à la demande:
-la lisibilité du code réalisant le processus de config est obtenu en ayant une méthode principale disons  run()  qui appelle les initialisations nécessaires à tous les types de traitements d’une appli cad  en particulier tout ce que peut regrouper (cf l’idée de groupe de ressources précédentes) sous le terme de controlleur et de vue.

-la possibilité de configuration à la demande va concerner des initialisations dont certaines sont
identifiables à partir de la requête (par ex la localisation des modèles d’un module) tandis que d’autres
initialisations comme la création d’objet  cache, session, log voire db ou acl ne seront  connues qu’en cour de
traitement.

-un autre avantage noté par Mikaelkael dans un précédent post c’est de ne pas donner à voir son code
s’il y a un problème de parsing dessus. (A condition bien sûr que la classe Bootstrap ne soit pas dans le répertoire  public).

Concernant l’usage des méthodes statiques leur intérêt c’est la rapidité sur une solution de type singleton,
l’inconvénient c’est d’après ce que j’ai pu lire qu’il y a un problème pour étendre une classe avec des
méthodes statiques mais bon si on part du principe que cette classe doit être complète par rapport à tout ce qui peut être à configurer comme ressource ZF dans une appli il suffit de la modifier en fonction des évolutions de ZF ;ce qui de toute façon serait nécessaire mais heureusement pas très courant.   
Je préfère la config avec ini  plutôt qu’avec XML  parce que j'ai remarqué qu’on peut employer dans un fichier ini des constantes définies en php (ce que je trouve intéréssant pour les paths) et que je trouve cela moins lourd qu’xml. 

L’utilisation d’une classe Bootstrap n’élimine bien sur pas le script index.php qui reste vital comme intermédiaire entre le serveur et l’appli et qui reste indispensable concernant l’aspect localisation des ressources (qu’on peut ou non voir comme une partie de la configuration). En effet il faut bien indiquer la localisation de la librairie Zend  et pour cela le seul moyen est l’include_path et cela doit être fait dans le script index.php ou au choix dans une méthode de Bootstrap.php appellé en premier dans la méthode run() (rem : j’élimine à priori la possibilité de définir l’include path dans le php.ini). 

La classe Bootsrap n’élimine pas non plus l’intérêt possible pour la configuration par plugin. Un exemple
étant la classe de Manub pour pointer vers le bon répertoire selon le module ou un autre concernant la localisation des scripts de vue, les css etc..   . Dans ces 2 cas toutefois une certaine étancheité des modules
entre eux s’impose pour reprendre l’idée de Gauthier dans un post précédent sur ce même thread.


PS je n’ai pas mis de code d’une part parce que c’est en chantier et d’autre part parce que je maîtrise pas bien les bbcode.   
Je signale 2 liens pour ceux que cette question interèsse  la dernière évolution de la proposition de Zend_Bootstrap devenue Zend_Application  et la page sur Zym_App auquel il renvoit
http://framework.zend.com/wiki/display/ … n+Scholzen
et le tuto sur zendex  http://code.google.com/p/zendex/wiki/Ze … spatcherFR
Les deux utilisent abondamment XML.

Hors ligne

 

#23 07-10-2008 21:52:28

BeRoots
Membre
Date d'inscription: 15-05-2008
Messages: 79

Re: set_include_path et ZF

@ManuB:

attention, je croit que tu confond $front->setControllerDirectory() et $front->addModuleDirectory()

Sinon en fait, comme le souligne Gchau, j'ai laisser de coté la méthode de plugin car cela arrive trop tard pour mon utilisation (dispatchLoopStartup)... en faite à bien y relechir en faite, je vais même laisser de coté la mise en dossier spécifique par module pour des raison évidente de maintenance (trop de fichier risque d'être en double d'un module à l'autre et cette architecture n'est pas terrible pour maintenir du code non redondant!!)

@Gchau: Sinon, tout re-sortir dans une classe peut être une solution à analyser mais de même, c'est deja trop spécifique pour moi...

Je veut faire en sorte d'avoir un system de gestion multi-appli qui tourne avec des parties communes à toutes les appli et des partie spécifique et facilement maintenable (pas de je redondance donc)...


wink Non au language SMS sur nos forums wink

Hors ligne

 

#24 08-10-2008 07:35:11

ManuB
Membre
Lieu: Auxerre
Date d'inscription: 17-10-2007
Messages: 49

Re: set_include_path et ZF

BeRoots a écrit:

@ManuB:

attention, je croit que tu confond $front->setControllerDirectory() et $front->addModuleDirectory()

Sinon en fait, comme le souligne Gchau, j'ai laisser de coté la méthode de plugin car cela arrive trop tard pour mon utilisation (dispatchLoopStartup)... en faite à bien y relechir en faite, je vais même laisser de coté la mise en dossier spécifique par module pour des raison évidente de maintenance (trop de fichier risque d'être en double d'un module à l'autre et cette architecture n'est pas terrible pour maintenir du code non redondant!!)

@Gchau: Sinon, tout re-sortir dans une classe peut être une solution à analyser mais de même, c'est deja trop spécifique pour moi...

Je veut faire en sorte d'avoir un system de gestion multi-appli qui tourne avec des parties communes à toutes les appli et des partie spécifique et facilement maintenable (pas de je redondance donc)...

.

Je ne confond pas.... addModuleDirectory() permet de définir en une seule fois et automatiquement tous les répertoire de tes controleurs


http://framework.zend.com/manual/fr/zen … dular.html voir le paragraphe 8.11.2 Spécification des dossiers de modules.

Je suis typiquement dans ton cas (je pense)..... Plusieurs applications indépendantes dont l'objectif étant d'avoir un seul point d'entrée.

Le fait est que j'ai par contre très peu de choses communes entre mes applis. très diverses (Gestion de bons de délégation pour les IRP(représentant du personnel, CE, DP, DS); Gestion de demande de requêtes infocentre, gestion de demandes de mission à des conseillés... et bien d'autres).

Le seul point commun levé à ce jour est l'authentification à ce point d'accès (utilisation de l'annuaire LDAP). et la gestion de l'accès aux applications...... Tout le monde ne fait pas parti des IRP....

Donc un plugin commun qui me gère l'authentification (650 utilisateurs potentiel d'une même appli., 200 de plus en 2010 mais j'espère ne plus etre la pour le voir.... ;-))...
Un Helper IsMemberOf() qui me permet d'intégrer le lien des applis si l'utilisateur appartient a certain groupe LDAP.

Et différents Helpers, qui me gère "mes ACL" rien a voir avec Zend_ACL....(pas encore...)

pour mon cas l'architecture modulaire s'imposait, et n'ayant pas d'adhérences entre mes applis j'ai choisi de spécifier des dossiers pour mes modèles par modules (application)

Ma solution n'est certainement la meilleure, Très optimisable, je ne suis de plus pas encore un pro de la POO, mais l'important à mes yeux est que la solution choisie réponde a un besoin, ce que fait ma méthode pour mon besoin... et poul'instant çà fonctionne bien.

Le jour où on me dit ou conseil de faire comme cela, que c'est mieux et que CA réponds a mon besoin, je prends....

Malgré les connaissances, l'espérience, j'apprends tout les jours...

Dernière modification par ManuB (08-10-2008 18:32:49)

Hors ligne

 

#25 08-10-2008 21:48:48

gauthier
Membre
Date d'inscription: 30-09-2008
Messages: 116
Site web

Re: set_include_path et ZF

moi, je n'ai pas grand chose de plus à dire pour le moment (je vais regarder les plug-ins d'initialisation de plus près, ça me semble intéressant), si ce n'est que je suis épaté qu'un sujet apparemment aussi banal ait suscité tant de réponses et de visites wink

Je me dis qu'il y a peut-être un déficit d'information dans la doc officielle sur ce point.


Consultant Zend Technologies // Blog perso : Logiciel libre et développement web -- http://freeblogware.org

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