Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework
Zend Framework Forum d'entraide sur la programmation PHP avec Zend Framework. Avant de poster -> FAQ ZF, Cours ZF
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/08/2007, 06h38   #1
Invité de passage
 
Inscription : août 2007
Messages : 7
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 7
Points : 3
Points : 3
Envoyer un message via MSN à zonzon
Par défaut Zend_Config + Zend_Registry + visibilité (scope)

Bonjour à tous,

j'utilise le Zend_Config_Ini pour lire un fichier de type .ini pour stocker mes configurations de site dans ma variable ou objet $config. Tout simplement WoW! On peut faire hériter les configurations de prod vs dev, etc....

En second lieu, pour avoir accès à ma variable $config partout, on dit d'utiliser le Zend_Registry qui est en réalité un singleton! Je fais de même avec $db qui contient en réalité l'espèce de handler que je voudrait utiliser partout. Voici le plus important de mon fichier index.php:

Code :
1
2
3
4
5
6
7
8
 
$config = new Zend_Config_Ini(dirname(__FILE__).'/../application/config/config.ini', 'staging');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);
...
$db = Zend_Db::factory($config->db->adapter,  $config->db->config->toArray());
Zend_Db_Table::setDefaultAdapter($db);
$registry->set('db', $db);
Ainsi, peu importe où le code sera, je pourrai avoir théoriquement accès à ces variables.... Ce que je trouve un peu irritant est d'accéder à ces deux variables ou objets dans mes controlleurs car je dois continuellement faire un Zend_Registry::get('config') et Zend_Registry::get('db')....

Devrais-je les stocker dans une variable privée de chaque classe controlleur lors de l'init() de celles-ci?

Ca arrange pas mon problème, car je veux tout autant que mes views scripts puissent accéder à une portion de ma $config. Par exemple, je veux que le $config->template->baseurl ou $config->global->sitename soient incluent dans mes scripts de vues......

Cela devient un peu «error prone» de faire dans toutes les actions de tous mes controlleurs le genre de chose suivante:

Code :
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
 
 
   public function indexAction()
    {
    	$config = Zend_Registry::get('config');
 
    	$this->view->siteName	= $config->global->siteName;
	$this->view->pageName	= "Users administration";
 
...
 
 
	public function searchAction()
	{
		$config = Zend_Registry::get('config');
 
		$this->view->siteName	= $config->global->siteName;
		$this->view->pageName	= "Search users";
 
	public function listAction()
	{	
		$config = Zend_Registry::get('config');
 
		$this->view->siteName	= $config->global->siteName;
		$this->view->pageName = "List users";
 
....

Il est évident que déclarer $config en global et hors de tout doute une mauvaise pratique, et vous me direz peut-etre que c'est ce que je semble chercher à faire!

Que dois-je faire? Meilleure pratique? Ce que je pense faire est d'initialiser le $config dans le init(), ce qui est commun à tout le controlleur, de faire

Code :
1
2
3
4
5
6
 
	function init()
	{
    	    $config = Zend_Registry::get('config');
    	    $this->view->siteName	= $config->global->siteName;
	}
et déléguer $this->view->pagename dans chaque action...... encore la il faut le faire pour chaque controlleur... :S:S

ais-je ratté completement le principe? Je cherche la perfection peut etre trop.... mais je veux bien démarer le projet... c'est tout


Merci
zonzon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 12h08   #2
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
Citation:
Envoyé par zonzon Voir le message
Que dois-je faire? Meilleure pratique? Ce que je pense faire est d'initialiser le $config dans le init(), ce qui est commun à tout le controlleur, de faire

Code :
1
2
3
4
5
6
 
	function init()
	{
    	    $config = Zend_Registry::get('config');
    	    $this->view->siteName	= $config->global->siteName;
	}
et déléguer $this->view->pagename dans chaque action......
oui c'est ce qu'il y a de mieux à faire pour ne pas avoir de code en double

Citation:
Envoyé par zonzon Voir le message
encore la il faut le faire pour chaque controlleur...
Pour ça je te conseille de créer une classe abstraite qui hérite de Zend_Controller_Action où tu mettra ce "init"
Et ensuite tes contrôleurs hériteront de cette classe
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 17h52   #3
Invité de passage
 
Inscription : août 2007
Messages : 7
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 7
Points : 3
Points : 3
Envoyer un message via MSN à zonzon
Merci poru la réponse! En plein ce que je pensais!
vive la POO!!!
zonzon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2007, 20h44   #4
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
Autre solution : développer un action helper qui contient le même init(). Cela permet de ne rien changer au code des controllers (ils héritent tous de Zend_Controller_Action).
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2007, 10h26   #5
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 41
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : janvier 2007
Messages : 41
Points : 35
Points : 35
Citation:
Envoyé par vg33 Voir le message
Autre solution : développer un action helper qui contient le même init(). Cela permet de ne rien changer au code des controllers (ils héritent tous de Zend_Controller_Action).
Bonjour,

J'ai pas encore saisi tout le concept des helpers. On peut donc, si je comprend bien créer un helper avec une fonction init() qui est automatiquement appellé lorsqu'on appelle un init() d'un certain controller?
coolcoco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2007, 19h17   #6
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
Dans le manuel ZF :
Citation:
Action Helpers (like Zend_View_Helpers) may be loaded and called on demand, or they may be instantiated at request time (bootstrap) or action controller creation time (init()).
Autant dire que si tu instancies ton helper dans le bootstrap (index.php), il va lancer la méthode init() de l'helper, puis le preDispatch(). Tu peux y glisser ton code à réaliser dans chaque controller. Ainsi, tu respectes le principe DRY, et tu n'as pas à dériver Zend_Controller_Action.
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h06.


 
 
 
 
Partenaires

Hébergement Web