Où placer la logique métier ?
Bonjour,
Je viens de parcourir le Quick Start au sujet du Zend Framework (http://framework.zend.com/docs/quickstart) et j'ai mit en place la structure de ma future application, sur base des infos trouvées dans ce manuel.
J'ai une question "MVC" suite à la lecture de ce document ... Ce QuickStart indique qu'il est intéressant de créer une classe par table dans la DB, étendant la classe Zend_Db_Table_Abstract ; ceci permettant d'inclure certains "business models".
Jusque là d'accord ... C'est par ailleurs une pratique que je faisais déjà avant d'utiliser Zend. J'ai donc fait celà, à titre d'exemple, pour une de mes tables :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
<?php
class Model_DbTable_Constante extends Zend_Db_Table_Abstract {
protected $_name = 'constante';
function insert(array $data) {
$data['datecreation'] = date('Y-m-d H:i:s');
return parent::insert($data);
}
function update(array $data, $where) {
$data['datemodification'] = date('Y-m-d H:i:s');
return parent::update($data);
}
} |
Le document préconise de sauver ce fichier dans application/models/DbTable, ce que j'ai également fait avant de poursuivre en créant une classe qui va inclure la logique métier relative à cette table ...
J'avoue que là ... j'ai déjà des difficultés à saisir ... Si le but est de mettre en place la logique métier propre à cette table (genre, insérer des données, les mettre à jour, les récolter, etc.) : pourquoi ne pas mettre cela directement dans le fichier créé précédement ?
Autre possibilité ... que cette classe reprenant la logique métier ne soit pas forcément liée UNIQUEMENT à une table (et donc à une classe) mais à plusieurs tables ... Dans mon exemple, à ma table "constante" devrait venir s'ajouter la table "constante_c" dans laquelle je vais sauver le contenu en fonction de la langue.
Je devrais donc créer une autre classe dans /application/models/DbTable, spécifiquement pour constante_c. J'imagine ensuite que ma classe métier serait une classe permettant la mise à jour des données dans les 2 tables.
Dans ce cas, je ne vois pas comment faire puisque le doc Zend indique ceci comme exemple de code :
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 28 29 30 31 32 33
|
class Model_Constante {
protected $_table;
function getTable() {
if (null === $this->_table) {
require_once APPLICATION_PATH . '/models/DbTable/Db_Constante.php';
$this->_table = new Model_DbTable_Constante();
}
return $this->_table;
}
function save(array $data)
{
$table = $this->getTable();
$fields = $table->info(Zend_Db_Table_Abstract::COLS);
foreach ($data as $field => $value) {
if (!in_array($field, $fields)) {
unset($data[$field]);
}
}
return $table->insert($data);
}
function fetchEntries()
{
return $this->getTable()->fetchAll('1')->toArray();
}
} |
En gros, la fonction getTable me permet uniquement de référer à un classe de Table >> pas possible de faire de la logique métier ayant trait à 2 tables, voire plus ...
Comment puis-je résoudre cela ?
Merci de vos conseils,
Olivier
Donnez de la puissance à vos modèles
Vous pouvez également lire l'atelier suivant
Donnez de la puissance à vos modèles