IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Db PHP Discussion :

Où placer la logique métier ?


Sujet :

Zend_Db PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Points : 80
    Points
    80
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    les exemples de code donnés dans le Quickstart ne sont pas à prendre au pied de la lettre, la richesse (et aussi un peu ce qui fait sa difficulté au début) de ZF est de permettre d'élaborer ses propres solutions en se basant sur un framework élaboré qui mâche une grande partie du boulot.

    Personnellement, j'ai les mêmes réserves que toi et je ne suis donc pas l'exemple donné par Zend dans le QuickStart ; j'implémente directement mes règles métiers dans les classes filles de Zend_Db_Table. C'est d'autant plus pratique que ZF permet de gérer les relations inter-tables sur un mode déclaratif.

    Maintenant, pour des applications à la logique particulièrement complexe et/ou avec un MCD compliqué, il peut être utile de passer par une couche intermédiaire d'objets métiers qui font l'interface entre les contrôleurs et les objets Table. Mais dans ce cas, l'exemple trivial de ce type d'objet donné dans le QuickStart est à remanier sérieusement.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Points : 80
    Points
    80
    Par défaut
    Merci de ces quelques précisions ...

    Une question en plus :-)

    J'ai une table "constante" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    nom 	| varchar(150)
    datecreation | datetime
    datemodification | datetime
    statut | tinyint(1)
    Cette table contient des libellés utilisés pouvant être utilisés sur le site. Les libellés sont définis dans cette table mais le contenu des libellés en eux-mêmes sont définis dans une table "constante_c" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    id | int(5)
    constante | int(5)
    contenu | varchar(255)
    langue | tinyint(1)
    datecreation | datetime
    datemodification | datetime
    Ceci me permet donc d'avoir 1 libellé dans la table "constante" avec plusieurs occurences dans la table "constante_c" pour permettre un site multilangue. Le lien entre la table "constante" et "constante_c" se faisant sur "constante_c.constante = constante.id".

    Nous avons donc aussi la table "langue" et la table "statut", relié aux tables "constante" et "constante_c", selon le même principe :

    LANGUE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    id | tinyint(1) 	 	
    code | varchar(5)
    langue | varchar(15)
    datecreation | datetime
    datemodification | datetime
    statut | tinyint(1)
    STATUT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id | tinyint(1) 	
    statut | varchar(5)
    datecreation | datetime
    datemodification | datetime
    Voici le décors (enfin) planté ...

    J'ai donc une classe pour chacune de ces tables. Comme vous l'aurez compris en regardant un peu la structure de mes tables, mes requêtes SELECT demandent beaucoup de JOIN.

    Ma question : dois-je définir dans une des classes définissant mes tables, une fonction définissant une logique SELECT faisant une bonne fois pour toute ces liaisons et que je n'aurai plus à utiliser OU toutefois créer une autre classe faisant la relation entre les différentes classes de tables ?

    Merci et bonne journée
    Olivier

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 32
    Points
    32
    Par défaut Donnez de la puissance à vos modèles
    Vous pouvez également lire l'atelier suivant

    Donnez de la puissance à vos modèles

Discussions similaires

  1. Logique métier stockée en PL SQL ou en service Java ?
    Par heroined dans le forum Général Java
    Réponses: 17
    Dernier message: 12/06/2015, 11h45
  2. [2.x] Ou mettre la logique métier ?
    Par Guldil dans le forum Symfony
    Réponses: 6
    Dernier message: 30/11/2011, 11h28
  3. Ou placer la logique metier?
    Par boukhali dans le forum Design Patterns
    Réponses: 3
    Dernier message: 20/09/2011, 16h52
  4. ASP.Net MVC rend-il la logique métier portable?
    Par Immobilis dans le forum ASP.NET MVC
    Réponses: 10
    Dernier message: 09/09/2011, 08h54
  5. Réponses: 4
    Dernier message: 08/10/2008, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo