Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 06-10-2009 12:02:43

Seubeu
Membre
Date d'inscription: 28-09-2009
Messages: 19

[Résolu] [1.9.1] Question de bonne pratique pour débutant MVC & PHPOO

Bonjour a tous,

Juste une petite question de bonne pratique.

disons que j'ai un Model "Users" pour une table d'utilisateur avec ses methodes (Delete Update Create)

et mon controleur "User" comme ceci :

Code:

class UsersController extends Zend_Controller_Action
{
    
    public function init ()
    {/* Initialize action controller here */}

    public function indexAction ()
    {

    }
    
     public function deleteAction()
    {
        
    }
    
    public function addAction ()
    {
    
    }

}

Vu que les 3 methodes du controllers (indexAction()/deleteAction()/addAction()) vont utilisées mon model, est ce que c'est grave si je met dans chaque action de mon controller :

Code:

$users = new Model_DbTable_Users;

N'y a t il pas un meilleur moyen de faire ? la déclarer une fois pour toute et que toute les méthodes de ce controlleur puissent directement utiliser $users->ModelMethode() ?

Merci de vos réponses. Et désolé si la question semble bête mais je débute en PHPOO et j'attaque direct avec le Zend Framework ça fait beaucoup à assimiler smile

Amicalement,
Seb.

Dernière modification par Seubeu (06-10-2009 17:01:15)

Hors ligne

 

#2 06-10-2009 12:23:46

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

Re: [Résolu] [1.9.1] Question de bonne pratique pour débutant MVC & PHPOO

dans mon controleur je mets dans la méthode init l'instanciation de mon modèle
et je l'affecte SYSEMATIQUEMENT au membre model de mon contrôleur ainsi quelque soit le modèle j'ai toujours le même type d'appel et en plus c'est clair que j'invoque le modèle tout comme la vue s'appelle view le modèle s'appelle model

Code:

    protected function init()
    {
      $this->model = new Model_DbTable_Users;
    }

deplus pour moi une table n'est pas un modèle métier mais un classe d'accès au données j'ai donc un classe métier User qui définit les action que l'on peut faire sur les User comme calculer anniversaire ou calculer l'ancienneté etc... celle-ci est le modèle au sens MVC c'est bien le métier de mon application (du moins une partie)
cette classe va utiliser ou non suivant les besoins une couche de persistance. en clair un moyen de conserver les données. pour cela elle va par exemple utiliser ta classe DbTable_User pour accéder au données de la base et donc assurer sa persistance.

souvent on n'a pas de réel métier, on veut juste lire/écrire/supprimer les données du coup la classe métier ne contient rien et il semble bien plus facile d'utiliser la couche persistance en lieu et place de la couche métier

c'est à mon humble avis une erreur prendre l'habitude d'écrire la couche métier indépendamment de la couche persistance assure une meilleure évolutivité et maintenabilité. de même pour la réutilisabilité.

si je prends donc cas de User ta classe ne contiendrait rien d'autre que les appels à la couche persistance.
j'ymagine que pour un début ton application est relativement simple.

puis tu passe à une autre plus complexe et tu réutilise tes classes. mais du coup ton modèle est utilisé dans de nombreux modules.

l'évolution suivante consiste à changer de mode de persistance tes User ne sont plus en base mais dans LDAP il te faut réécrire ta classe métier est changer tous tes modules impactés

alors que si tu as une classe métier changer la persistance n'impacte que cette classe métier quelque soit l'usage qui en est fait.

autre évolution que tu va rencontrer tu utilise ta classe User dans un phorum et tu veux ajouter l'ancièneté et les anniversaire
tu vas devoir le mettre dans la table alors que ça n'a rien à voir avec la base

A+JYT

Hors ligne

 

#3 06-10-2009 14:12:52

Seubeu
Membre
Date d'inscription: 28-09-2009
Messages: 19

Re: [Résolu] [1.9.1] Question de bonne pratique pour débutant MVC & PHPOO

Salut,

Tout d'abord merci de ta réponse. Cependant j'ai eut un peu de mal a "déchiffrer" smile

c'est à mon humble avis une erreur prendre l'habitude d'écrire la couche métier indépendamment de la couche persistance assure une meilleure évolutivité et maintenabilité. de même pour la réutilisabilité.

J'ai compris les thermes techniques, j'ai pas compris le sens de la phrase hehe smile

Je vais donc te demander une confirmation par l'exemple.

Lors de mes recherches je suis tomber sur un site plutot instructif : www.zendcasts.com (j'espère que les liens extérieur sont autorisés et que les modos ne m'en voudrons pas...). Il donne donc un exemple d'inter-actions avec une BDD Mysql en utilisant effectivement, et c'est la qu'on va voir si j'ai bien compris:


Une couche "métiers" comme tu dis (Appelé dans son cas "UserService.php" et située dans "library/App/") :

Code:

<?php

class App_UserService 
{
        protected $db;
        
        /**
         * users Zend Table
         *
         * @var UsersTable
         */
        protected $users;
        function __construct()
        {
                $options = array(
                        'host'          => 'localhost',
                        'username'  =>  'root',
                        'password'      =>      'root',
                        'dbname'        => 'zendcastdev'                
                );
                
                $this->db = Zend_Db::factory('PDO_MYSQL', $options);
                Zend_Db_Table_Abstract::setDefaultAdapter($this->db);
                
                $this->users = new UsersTable();                                
        }
        public function NewTestUser()
        {
                $params = array(
                        'name' => 'jane doe',
                        'email' => 'jane@doe.com');
                $this->users->insert($params);
        }
        public function SaveUser($id, $name, $email)
        {
                $params = array(
                        'name' => $name,
                        'email' => $email
                );
                $this->users->update($params, $this->getWhereClauseForUserId($id));
                
        }
        private function getWhereClauseForUserId($id)
        {
                return $this->users->getAdapter()->quoteInto('id = ?', $id);    
        }
        public function NewUser($name , $email)
        {
                $params = array(
                        'name' => $name,
                        'email' => $email
                );
                $this->users->insert($params);
                                
        }
        public function DeleteUser($id)
        {
                $this->users->delete($this->getWhereClauseForUserId($id));
        }
        public function GetUser($id)
        {
                $row = $this->users->find($id);
                return $row;
        }
        public function GetAllUsers()
        {
                $select = $this->users->select();
                $select->order('name');
                
                return $this->users->fetchAll($select);
                
        }

}

?>

Et une couche persistance (Appelé ici "UsersTable.php" et située dans application/default/UsersTable.php) :

Code:

<?php

/**
 * UsersTable
 *  
 * @author jon
 * @version 
 */

require_once 'Zend/Db/Table/Abstract.php';

class UsersTable extends Zend_Db_Table_Abstract {
        /**
         * The default table name 
         */
        protected $_name = 'users';

}

Et voici donc son contrôleur qui effectivement, (encore une fois, si j'ai bien compris) reste inchangé si les données venaient a provenir de LDAP :

Code:

<?php

/**
 * IndexController - The default controller class
 * 
 * @author
 * @version 
 */

require_once 'Zend/Controller/Action.php';

class IndexController extends Zend_Controller_Action 
{
        /**
         * Entry into the User Service Layer
         *
         * @var App_UserService
         */
        protected $userService;
        
        public function preDispatch()
        {
                $this->userService = new App_UserService();
        }
        
        /**
         * The default action - show the home page
         */
    public function indexAction() 
    {
        if ($this->getRequest()->isPost())
        {
                $this->userService->NewUser($this->_getParam('name'),$this->_getParam('email'));
        }
        
                $rowset = $this->userService->GetAllUsers();
                $this->view->users = $rowset->toArray();
        }
        public function updateAction()
        {
                if ($this->getRequest()->isPost())
                {
                        $this->userService->SaveUser(
                                $this->_getParam('id'),
                                $this->_getParam('name'),
                                $this->_getParam('email')
                        );
                        $this->_redirect('index');                      
                }
                else
                        $this->view->user = $this->userService->GetUser($this->_getParam('id'))->current();
                
        }
        public function deleteAction()
        {
                $this->userService->DeleteUser($this->_getParam('id'));
                $this->_redirect('index');
                
        }
        
}

Est ce que c'est bien a ce genre de méthode que tu fais allusion et que tu préconises?

Merci pour tes lumières smile

Sébastien.

Hors ligne

 

#4 06-10-2009 16:55:27

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

Re: [Résolu] [1.9.1] Question de bonne pratique pour débutant MVC & PHPOO

oui c'est bien ce que je preconise
quant à ma petit phrase sorry pressé par mes collègues pour aller manger j'ai tappé vite et j'ai pas relus

souvent on n'a pas de réel métier, on veut juste lire/écrire/supprimer les données du coup la classe métier ne contient rien et il semble bien plus facile d'utiliser la couche persistance en lieu et place de la couche métier
c'est à mon humble avis une erreur !

prendre l'habitude d'écrire la couche métier indépendamment de la couche persistance assure une meilleure évolutivité et maintenabilité, de même pour la réutilisabilité.

Hors ligne

 

#5 06-10-2009 17:00:42

Seubeu
Membre
Date d'inscription: 28-09-2009
Messages: 19

Re: [Résolu] [1.9.1] Question de bonne pratique pour débutant MVC & PHPOO

Ok bah j'avais bien compris alors ! smile

Merci pour ton aide précieuse. Je refais mon code de ce pas smile

Amicalement,
Sébastien.

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