33 votes

Modèles dans le framework Zend

Quels sont les moyens que vous avez mis en œuvre des modèles dans le Zend Framework?

J'ai vu la base class User extends Zend_Db_Table_Abstract puis de mettre les appels pour que vos contrôleurs:

$foo = new User;

$foo->fetchAll()

mais qu'en plus sophistiqués utilise? Le Démarrage rapide de la section de la documentation en offre un exemple, mais je me sens toujours comme je ne suis pas une "meilleure utilisation" exemple, pour les modèles dans le Zend Framework. Intéressante implémentations là-bas?


EDIT: je me dois de préciser, en réponse à la CMS commentaire)... je sais à propos de faire plus compliqué sélectionne. J'ai été intéressé par les méthodes d'ensemble du concept de Modèle et des exemples concrets de la façon dont les autres les ont mises en œuvre (en gros, le truc le manuel feuilles et les trucs que les bases du silence)

61voto

Bill Karwin Points 204877

J'ai travaillé pour Zend et a fait un peu de travail sur le Zend_Db_Table composant.

Zend Framework ne donne pas beaucoup d'indications sur la notion de "Modèle" à l'égard du Modèle du Domaine modèle. Il n'y a pas de classe de base pour un Modèle, parce que le Modèle encapsule une partie de la logique métier spécifiques à votre application. J'ai écrit un blog à propos de ce sujet plus en détail.

La persistance d'une base de données doit être un interne détail de l'implémentation d'un Modèle. Le Modèle, en général, utilise une ou plusieurs tables. C'est une commune, mais une mauvaise conception orientée objet à considérer un Modèle comme une extension d'une Table. En d'autres termes, nous devrions dire que le Modèle A-UNE Table-pas de Modèle EST-UNE Table.

Ceci est un exemple de EST-UN:

class MyModel extends Zend_Db_Table_Abstract
{
} 

Ceci est un exemple de A-A:

class MyModel // extends nothing
{
    protected $some_table;
}

Dans un vrai modèle de domaine, vous utilisez $some_table dans les méthodes de Monmodèle.

Vous pouvez également lire Martin Fowler prendre sur le Modèle du Domaine modèle de conception, et de sa description de l' Anémie du Modèle de Domaine antipattern, qui est de savoir comment de nombreux développeurs malheureusement approche de la programmation orientée-objet.

23voto

Barrett Conrad Points 1705

Personnellement, je sous-classe à la fois Zend_Db_Table_Abstract et Zend_Db_Table_Row_Abstract. La principale différence entre mon code et le vôtre, c'est que traiter explicitement de la sous-classe d' Zend_Db_Table_Abstract comme un "tableau" et Zend_Db_Table_Row_Abstract "ligne". Il est très rare que je vois des appels directs pour sélectionner des objets, SQL, ou intégré dans ZF la base de données de méthodes dans mes contrôleurs. J'essaie de masquer la logique de demander des documents spécifiques, à des appels à derrière Zend_Db_Table_Abstract comme:

class Users extends Zend_Db_Table_Abstract {

    protected $_name = 'users';

    protected $_rowClass = 'User'; // <== THIS IS REALLY HELPFUL

    public function getById($id) {
        // RETURNS ONE INSTANCE OF 'User'
    }

    public function getActiveUsers() {
        // RETURNS MULTIPLE 'User' OBJECTS            
    }

}

class User extends Zend_Db_Table_Row_Abstract {

    public function setPassword() {
        // SET THE PASSWORD FOR A SINGLE ROW
    }

}

/* CONTROLLER */
public function setPasswordAction() {

    /* GET YOUR PARAMS */

    $users = new Users();

    $user = $users->getById($id);

    $user->setPassword($password);

    $user->save();
}

Il existe de nombreuses façons d'aborder cette. Ne pense pas que ce soit la seule, mais j'essaie de suivre l'intention de la ZF de la conception. (Ici plus de mes pensées et de liens sur le sujet.) Cette approche ne obtenir un peu de classe lourde, mais je pense qu'il garde les contrôleurs axé sur la gestion de l'entrée et de la coordination avec la vue; en laissant le modèle pour faire la demande de travail spécifique.

7voto

smack0007 Points 5215

Ne jamais utiliser Zend_Db_Table comme votre modèle. Il vous permet de vous causer des ennuis. Soit vous écrivez votre propre modèle de classes qui utilisent Zend_Db_Table de parler à votre base de données ou vous pouvez lire mon blog ici pour un hack qui vous permet d'un peu de combiner le "Modèle" de la classe et de Zend_Db_Table.

La principale chose à ne pas, c'est que lorsque vous utilisez Zend_Db_Table directement dans vos controllers vous finissez par faire les mêmes choses dans plusieurs endroits. Si vous devez apporter une modification à une partie de cette logique, vous devez faire un changement dans plusieurs endroits. Pas bonne. Mon premier projet professionnel a été fait comme ça parce que j'étais le seul dans l'entreprise qui avait pour apprendre à utiliser ZF et c'est un désordre total maintenant.

J'ai aussi tendance à écrire des fonctions d'assistance dans mes classes pour des extractions. Quelque chose comme $table->doNameFetchAll() ou $table->doOrderFetchAll().

7voto

ironkeith Points 464

J'ai fait quelques recherches sur les Modèles de ZF et suis tombé sur une intéressante série d'articles par Matthew Weier O''Phinney qui sont bien la peine de vérifier:

Ce n'est pas "le code de production" et beaucoup est laissé à l'imagination, mais c'est une bonne lecture et m'a aidé un peu.

5voto

d-_-b Points 2690

Un modèle n'a rien à voir avec la base de données . Que se passe-t-il si je récupère des données depuis un flux RSS ou un service SOAP ou si je lis des fichiers depuis le serveur de fichiers?

Je mets tout ce genre de choses dans des modèles. Dans ce cas, ma classe de modèles peut ne rien étendre . Je suis sur le point d'écrire un modèle qui utilise des méthodes d'autres modèles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X