Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-11-2008 10:14:51

neeux
Membre
Date d'inscription: 03-07-2008
Messages: 29

[Rés]Accéder à une classe dans toute l'application sans la redéclarer

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

Code:

$lg = new lg();

$lg->maMethode();

Seulement ça devient vite très très lourd de devoir mettre à chaque fois

Code:

$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

 

#2 24-11-2008 10:30:19

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

Re: [Rés]Accéder à une classe dans toute l'application sans la redéclarer

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


----
Gruiiik !

Hors ligne

 

#3 24-11-2008 10:42:34

neeux
Membre
Date d'inscription: 03-07-2008
Messages: 29

Re: [Rés]Accéder à une classe dans toute l'application sans la redéclarer

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

 

#4 24-11-2008 11:00:52

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

Re: [Rés]Accéder à une classe dans toute l'application sans la redéclarer

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();
  }
}

Code:

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 :

Code:

Zend_Registry::set('userModel', new UserModel());

Code:

class IndexController extends My_Controller_Action
{
  public function IndexAction()
  {
    $this->view->users = Zend_Registry::get('userModel')->fetchAll();
  }
}

le singleton :

Code:

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;
 }
}

Code:

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)


----
Gruiiik !

Hors ligne

 

#5 24-11-2008 11:57:41

nick
Membre
Date d'inscription: 31-05-2008
Messages: 84

Re: [Rés]Accéder à une classe dans toute l'application sans la redéclarer

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

 

#6 24-11-2008 12:13:20

neeux
Membre
Date d'inscription: 03-07-2008
Messages: 29

Re: [Rés]Accéder à une classe dans toute l'application sans la redéclarer

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

 

#7 24-11-2008 14:49:28

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

Re: [Rés]Accéder à une classe dans toute l'application sans la redéclarer

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 :

Code:

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)


----
Gruiiik !

Hors ligne

 

#8 24-11-2008 16:52:06

farf
Membre
Date d'inscription: 21-11-2008
Messages: 37

Re: [Rés]Accéder à une classe dans toute l'application sans la redéclarer

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

 

#9 25-11-2008 08:01:28

neeux
Membre
Date d'inscription: 03-07-2008
Messages: 29

Re: [Rés]Accéder à une classe dans toute l'application sans la redéclarer

Merci nORKy. Ça fonctionne impeccable

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