Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Je cherche un moyen d'accéder aux méthodes de certaines de mes classes dans toutes l'application.
Actuellement que je soit dans un controller ou dans une vue, je doit faire un
$lg = new lg(); $lg->maMethode();
Seulement ça devient vite très très lourd de devoir mettre à chaque fois
$lg = new lg();
Comment puis je déclarer ma classe dans la variable $lg une fois pour toute?
Je vous remercie par avance de vos réponse.
Maxence
Dernière modification par neeux (25-11-2008 08:02:30)
Hors ligne
Les globals, c'est pas bien.
qq solutions en vrac :
- étend Zend_Controller_Action, (en utilisant __construct et un variable de classe)
- utilise Zend_Registry (Zend_Registry::get(lg)->mamethod())
- utilise un pattern singleton (lg::getInstance()->mamethod())
bon courage
Hors ligne
Merci de ta réponse.
Mais quand tu dis que c'est pas bien. Dans ce genre de cas qu'elle est la bonne pratique?
Pour être plus explicite, dans l'exemple:
J'ai une classe users (model) avec des méthodes comme getName($uid), getEmail($uid), etc...
Ces méthodes je les utilises beaucoup dans mes controllers (Dans la quasi intégralité) et parfois aussi dans les vues (Je sais ça c'est pas bien..... pardon....)
Dans ce cas quels sont les bonnes pratiques?
PS: Je précise que je débute avec le Zend Framework....
Hors ligne
Les bonnes pratiques sont celles que j'ai dit juste au dessus.
Je t'écris le code :
class My_Controller_Action extends Zend_Controller_Action { public $userModel; public __construct() { $this->userModel = new User(); } }
class IndexController extends My_Controller_Action { public function IndexAction() { $this->view->users = $this->userModel->fetchAll(); } }
Zend_Registry
Tu fais un plugin (voir la doc du ZF) et dans ton plugin :
Zend_Registry::set('userModel', new UserModel());
class IndexController extends My_Controller_Action { public function IndexAction() { $this->view->users = Zend_Registry::get('userModel')->fetchAll(); } }
le singleton :
class userModel { protected $_instance = null; protected function __construct() { // du code } static public function getInstance() { if (null === self::$_instance) { self::$_instance = new self(); } return self::$_instance; } }
class IndexController extends My_Controller_Action { public function IndexAction() { $this->view->users = userModel::getInstance()->fetchAll(); } }
Dernière modification par nORKy (24-11-2008 11:01:40)
Hors ligne
nORKy a écrit:
Les globals, c'est pas bien.
qq solutions en vrac :
- étend Zend_Controller_Action, (en utilisant __construct et un variable de classe)
- utilise Zend_Registry (Zend_Registry::get(lg)->mamethod())
- utilise un pattern singleton (lg::getInstance()->mamethod())
bon courage
Question :
j'ai des constantes que je définis pour toute l'application (repertoire pour le cache, pour l'index, pour stocker les fichiers média, etc...)
Ces constantes ont une partie dynamique (suivant le rootdir) et une partie que je définis en dur ( . '/storage/files' par exemple).
Je les ai définis en globals, j'entends souvent que c'est pas bien mais je ne sais pas pourquoi.
Tu me conseilles de les mettre dans le registre ? (sachant que je passe pas tout le temps par le front controller)
Hors ligne
nORKy a écrit:
Les bonnes pratiques sont celles que j'ai dit juste au dessus.
Je t'écris le code :Code:
class My_Controller_Action extends Zend_Controller_Action { public $userModel; public __construct() { $this->userModel = new User(); } }
Merci pour ta réponse nORKy..
Juste une autre question de débutant.....
J'ai donc créé la classe My_Controller_Action dans un fichier Action.php que j'ai mis dans le dossier des controllers.
Dans le bootstrap j'ai rajouté la ligne
require_once 'default/controllers/Action.php';
Mais ca me fait une erreur:
Fatal error: Call to a member function notifyPreDispatch() on a non-object in /home/maxence/public_html/library/Zend/Controller/Action.php on line 485
M'y serais-je pris comme un pied?
Hors ligne
nick : as mon avis, l'utilisation de constante dans ton cas n'est pas un problème du moment quels sont biens nommée et rassemblé dans un seul fichier.
On utilise souvent les constantes (je suis programmeur C initialement) pour du texte ou des chemins par exemple. Ceci afin de changer tous simplement un valeur facilement dans le programme sans avoir à la chercher.
Enregistrer quelques constantes qui ne sont que des chaines de caractères n'est pas gênant par rapport à la place mémoire occupé par le programme. Ca devient plus lourd lorsqu'on enregistre des classes entières. Car, une constate/global/static est vivante pendant toute la durée du programme contrairement aux variables locales.
Quand on code, il est bien de faire en sorte que ca soit facile à coder, mais il faut penser aussi que le code doit être facilement lisible
neeux :
remplace __construct() par init()
ou alors, fait ca :
public function __construct(Zend_Controller_Request_Abstract $request, Zend_ Controller_Response_Abstract $response, array $invokeArgs = array()) { parent::__csontruct($request, $response, $invokeArgs); ... }
Dernière modification par nORKy (24-11-2008 14:51:47)
Hors ligne
Bonjour,
Discussion très intéressante.
Pourquoi Zend_Db_Table n'est-il pas un singleton? Est-il normal de vouloir créer sa classe MyDatas quie st un singleton et dont hérite toutes mes classes qui normalement étendent Zend_Db_Table?
Merci d'avance pour vos réponses.
Farf
Hors ligne
Merci nORKy. Ça fonctionne impeccable
Hors ligne
Pages: 1