Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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 :
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 :
$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
Amicalement,
Seb.
Dernière modification par Seubeu (06-10-2009 17:01:15)
Hors ligne
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
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
Salut,
Tout d'abord merci de ta réponse. Cependant j'ai eut un peu de mal a "déchiffrer"
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
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/") :
<?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) :
<?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 :
<?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
Sébastien.
Hors ligne
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
Ok bah j'avais bien compris alors !
Merci pour ton aide précieuse. Je refais mon code de ce pas
Amicalement,
Sébastien.
Hors ligne
Pages: 1