Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Salut la compagnie
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
Hors ligne
Avec cette question, il y a moyen de lancer des querelles de clocher à n'en plus finir
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
http://www.z-f.fr/forum/viewtopic.php?id=1160
A+, Philippe
Hors ligne
ok, j'ai vue ce qu'il en était et cela était fort instructif
Mais mieux qu'un long discourt, regardont cette exemple:
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:
$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:
$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
Dernière modification par BeRoots (05-10-2008 01:38:43)
Hors ligne
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