Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 02-10-2008 06:30:18

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

Models: mise au point

Salut la compagnie smile

Je cherche à comprendre un peu l'utilisation de model et le comment créé ces models...

- Si quelqu'un peut me dire ce qu'est réelement le model (une classe d'interpretation/definition d'une table de db ou allors un fichier sql de definition de la table) ?

- Si quelqu'un peut me dire si les models ne s'applique qu'au table de db ?

Je verrai pour les autres points en suspents par la suite car cela fait dejà beaucoup de question.

Merci d'avance smile


wink Non au language SMS sur nos forums wink

Hors ligne

 

#2 02-10-2008 09:21:06

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

Re: Models: mise au point

Avec cette question, il y a moyen de lancer des querelles de clocher à n'en plus finir smile

y'a un vieux topic qui en parlait, je t'invite à aller voir et entendre pas mal de sons de cloche. Reviens ici si tu as des questions sur le contenu du topic smile

http://www.z-f.fr/forum/viewtopic.php?id=1160

A+, Philippe


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

Hors ligne

 

#3 04-10-2008 23:18:58

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

Re: Models: mise au point

ok, j'ai vue ce qu'il en était et cela était fort instructif smile

Mais mieux qu'un long discourt, regardont cette exemple:

Code:

class WebmasterModel extends Zend_Db_Table_Abstract
{
    /**
    * spécifie le nom de table
    *
    * @access  protected
    * @var     string
    */
    protected $_name = 'webmasterTable';

    /**
    * spécifie la clé primaire
    *
    * @access  protected
    * @var     array
    */
    protected $_primary = array('id');

    /**
    * spécifie l'auto-incrementation de la table
    *
    * @access  protected
    * @var     boolean
    */
    protected $_sequence = true;

    /**
    * spécifie l'auto-incrementation de la table
    *
    * @access  public
    * @var     Zend_Db_Table_Row object
    */
    public $infos_webmaster;

    /**
    * Récuperations des informations sur le webmaster
    *
    * @name    getInfos
    * @access  public
    * @return  Zend_Db_Table object
    */
    public function getInfos()
    {
        $this->infos_webmaster = parent::find(1);
        return $this->infos_webmaster[0];
    }
}

j'ai beau faire en sorte de tester depuis mon bootstrap mais rien à faire...
Quand au bootstrap je fait ceci (donc sans classe model), tout fonctionne et $infos_webmaster me retourne un tableau de resultat:

Code:

$webmaster_db = Zend_Db::factory($registry->config->db->driver, array(
    'host'        => $registry->config->db->host,
    'username'    => $registry->config->db->user,
    'password'    => $registry->config->db->password,
    'dbname'      => 'MVC_'.$registry->system->webmaster->reference.'_db',
    'options'     => array(
                         Zend_Db::CASE_FOLDING => Zend_Db::CASE_NATURAL,
                         Zend_Db::AUTO_QUOTE_IDENTIFIERS => true
                     )
));
Zend_Registry::set('webmaster_db', $webmaster_db);


/**
* récuperation des infos webmaster
*/
try{
    $webmaster_db->getConnection();
    // on recupère les infos contenu dans l'enregistrement unique d'id=1 (retourne un Rowset)
    $infos_webmaster = $webmaster_db->fetchRow("SELECT * FROM webmasterTable WHERE `id` = '1'");
    $webmaster_db->closeConnection();
}
catch(Zend_Db_Adapter_Exception $e){
    // probablement mauvais identifiants, ou alors le SGBD n'est pas joignable
    echo 'error1';
}
catch(Zend_Exception $e){
    // probablement que factory() n'a pas réussi à charger la classe de l'adaptateur demandé
    echo 'error2';
}

Par contre lorsque j'essaye d'utiliser mon model comme suit, j'ai une erreur:

Code:

$webmaster_db = Zend_Db::factory($registry->config->db->driver, array(
    'host'        => $registry->config->db->host,
    'username'    => $registry->config->db->user,
    'password'    => $registry->config->db->password,
    'dbname'      => 'MVC_'.$registry->system->webmaster->reference.'_db',
    'options'     => array(
                         Zend_Db::CASE_FOLDING => Zend_Db::CASE_NATURAL,
                         Zend_Db::AUTO_QUOTE_IDENTIFIERS => true
                     )
));
Zend_Registry::set('webmaster_db', $webmaster_db);

/**
* récuperation des infos webmaster
*/
try{
    $webmaster_db->getConnection();
    $webmaster = new WebmasterModel(array('webmaster_db' => 'webmaster_db')); //recuperation de l'adapter au registre
    $infos_webmaster = $webmaster->getInfos($webmaster);
    $webmaster_db->closeConnection();
}
catch(Zend_Db_Adapter_Exception $e){
    // probablement mauvais identifiants, ou alors le SGBD n'est pas joignable
    echo 'error1';
}
catch(Zend_Exception $e){
    // probablement que factory() n'a pas réussi à charger la classe de l'adaptateur demandé
    echo 'error2';
}

Dans ce second exemple, apparament je me trouve dans le cas du second catch (affiche: 'error2')

1°) Si quelqu'un peut me dire si il est judicieux de definir des methodes pour exploitation de ma table dans mon model correspondant à cette dernière ?

2°) Si quelqu'un peut me dire pourquoi j'ai un problème dans le second cas de figure ?

Merci d'avance pour votre aide précieuse wink

Dernière modification par BeRoots (05-10-2008 01:38:43)


wink Non au language SMS sur nos forums wink

Hors ligne

 

#4 05-10-2008 09:36:20

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Models: mise au point

le model et les table n'ont rien à voir
le model c'est CE que sais réellement faire ton application quel sont les concept qu'elle manipule.

tu peux donc très bien avoir un model sans aucune table et aucune base de donnée.

tu as la vue qui présente les élément à l'utilisateur
le contrôleur qui ordonnance les tâches et s'assure du bon fonctionnement de la cinématique de l'application
Le model qui lui assure le traitement effectif de l'information.

si ton application à besoin de conserver de l'information alors tu as besoin d'une couche de persistance
et si cette information est stockée dans une base de données relationnelle alors Zend-Db et tout le reste est là pour te permettre de mettre en place ta persistance.

le model est donc une classe qui implémente des traitements et des définitions de donnée structurées.
au besoin il s'appuie donc sur une couche de persistance que sont les instance de Table et Row.

Maintenant ZF n'oblige rien quant à la définition du model
si ton modèle est très riche en traitement et n'a pas ou que peu de persistance alors tu peux faire une ou plusieurs classe pour ton modèle qui appelleront directement les classes Zend pour la persistance.

si ton modèle a beaucoup de traitement et de persistance alors le mieux est de définir des classes métier portant les traitement du modèle qui appelle des des classes de persistance dérivant des classes Zend.

si le modèle est pauvre en traitement mais lourd en persistance tu peux faire porter les traitements au classe table et row dérivées de celle de Zend

les quelques exemples de la doc pour rester simple sont dans ce dernier cas.


j'oubliais le cas dans lequel je me trouve en ce moment. les traitements métier sont porté par des procédure stockées en base. ma couche modèle n'est alors qu'une façade qui mets à disposition du contrôleur les procédure du metier j'ai en gros dans mon modèle une procédure homonyme de celle qu'elle représente en base et une méthode privée _callProc($procName, $params)
qui fais un simple exec SQL de
$db->quoteInto('BEGIN EXECUTE '.$procName.'(?); END;', $params);


A+JYT

Dernière modification par sekaijin (05-10-2008 09:43:50)

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