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

MVC PHP Discussion :

Personnaliser le modèle et le contrôleur


Sujet :

MVC PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut Personnaliser le modèle et le contrôleur
    Bonjour
    je commence avec Zend pour la mise en place de mon site en respectant la structure MVC.
    J'ai suivi le tuto pour débutant sur ce site et tout va pour le mieux. Je cherche à optimiser mon application et pour cela j'ai quelques questions à vous poser.

    * Question concernant le modèle qui gère la BD
    J'ai bien créé ma classe de table objet héritant de la classe Zend_Db_table avec comme attribut le nom de la table dans ma base de données. Alors j'aimerai le personnaliser en ajoutant des méthodes. En gros faire en sorte que le modèle gère tous les accès à la base en récupérant les enregistrements et tout. Dans ce cas dois-je ajouter toutes mes méthodes dans ma classe de table ?

    Voici mon code pour le modèle:
    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 Poeme extends Zend_Db_Table
    {
    	protected $_name = 'poemes';
     
            //le reste concerne toutes les méthodes dont j'aurai besoin pour l'appli
    	public function lister()
    	{
    	}
     
             public function lire($id)
    	{
    	}
            ...
     
    }
    * Question concernant le contrôleur
    L'idée est que le contrôleur ne fasse aucune requête sql. Tout ce qu'il doit faire c'est juste instancier un objet du type modèle et toutes les actions du controleur utilisent l'objet Modèle instancié. Pour ce faire dois-je déclarer un attribut du type Modele en protected par exemple que j'initialise avec la méthode init() que je réecris?

    Voici le code du controleur

    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
     
    <?php
     
    class PoemeController extends Zend_Controller_Action 
    {
    	// Attribut 
            protected $poeme;
     
            /* Constructeur */
    	public function init()
    	{
    		$poeme = new Poeme();
     
     
    	}
     
    	/* Fonction affichant la liste de tous les poèmes */
    	function indexAction()
    	{
    		$this->view->titres = "Mes poemes";
    		$this->_helper->layout->setLayout('cust');
     
    		$result = $poeme->lister(); //appelle la methode lister de l'obejt poeme
    		$this->view->rez = $result;
     
    	}
     
            /* Fonction affichant juste un poeme */
            function lireAction()
            {
                   $result = $poeme->lire(1);
                   $this->view->rez = $result;
             }
    Voilà le ce que j'ai implémenté, hélas qui ne marche comme je le souhaite.
    Voici le message d'erreur que j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Notice: Undefined variable: poeme in C:\wamp\www\site_Patrick\application\controllers\PoemeController.php on line 28
     
    Fatal error: Call to a member function lister() on a non-object in C:\wamp\www\site_Patrick\application\controllers\PoemeController.php on line 28
    Donc je pense que l'action index n'arrive pas voir l'objet $poeme que je tente d'instancier via la méthode init()
    quelqu'un a une idée svp?

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Bonsoir,

    La variable $poème a une portée qui s'étend à la méthode dans laquelle elle a été initialisée, à savoir la méthode init(). Une fois la méthode terminée, la variable disparait et ne peut pas être récupérée "plus loin".

    Ce que tu as besoin de faire, c'est de stocker ton modèle dans une propriété de ton contrôleur par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    protected $_poeme = null;
     
    public function init ()
    {
        $this->_poeme = new Poeme();
    }
     
    public function indexAction ()
    {
        $result = $this->_poeme->lister();
    }
    Le Zend Framework nécessite pas mal d'apprentissage pour se maîtriser, et je te suggère de faire le point avant sur le du développement PHP, maîtriser notamment la portée des variables et toutes les fonctionnalités objets proposées par le langage Le reste de l'apprentissage n'en sera que plus facile. Ou tout du moins, moins pénible.

    Bon courage pour la suite !

  3. #3
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2008
    Messages : 71
    Par défaut
    Pour répondre à ta première question, il est possible de créer des méthodes dans ta classe qui gère ta table (celle qui étend Zend_Db_table).

    Cependant, j'opterais pour une autre solution, qui te permettrait de limiter la responsabilité de ta classe et en plus de faire abstraction complète de ta base de données. En effet, tu peux créer une classe de modèle qui possède des méthodes qui seront chargées d'appeler ta passerelle vers les tables. Par exemple (je sors complètement du cadre de ton projet pour illustrer, je me mets dans le cadre d'une gestion de news) :


    Ta passerelle vers les tables peut ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php 
     
    Class Model_News extends Zend_Db_Table_Abstract
    {
        protected $_name = 'news';
        protected $_primary = 'id_news';
     
    }

    Tu peux ensuite créer une classe d'abstraction du style :

    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
    34
    35
    36
    <?php
     
     
    Class ModelManager_news
    {
     
     protected $_gateway = null;
     
     
    public function __Construct()
    {
      $this->_gateway = new Model_News;
    }
     
    public function ListeToutesLesNews()
    {
    	return $this->_gateway->fetchAll();
    }
     
    public function ajouteNews (array $news)
    {
    	$nouvelleNews = $this->gateway->createRow();
    	$nouvelleNews->titre = $news['titre'];
    	$nouvelleNews->auteur = $news['auteur'];
    	$nouvelleNews->save();
    }
     
    public function recuperNews($idNews)
    {
    	return $this->_gateway->find($idNews)->current();
    }
     
    public function supprimeNews($idNews)
    {
    	return $this->_gateway->delete($idNews);
    }

    Ici, je n'étends pas ma passerelle vers ma table, mais je créé un "manager" pour gérer mes requêtes. L'avantage, c'est que je peux ajouter/supprimer des méthodes (donc des requêtes) dans ma classe ModelManager_news sans me demander si ces méthodes existent déjà dans la classe d'origine.

    L'autre avantage, c'est que si je change de système de gestion de données (en passant du SGBD à un webservice par exemple), je n'ai qu'à redéfinir les méthodes de mon ModelManager (par héritage). Le reste de mon code (notamment mon contrôleur) ne bouge pas.

    L'inconvénient, c'est que j'alourdis un peu mon code (un fichier de plus à trouver et inclure et un nouvel objet à instancier). Mais avec un bon système de cache, le problème de performances est vite résolu.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut global ou passage par référence
    Je vous remercie de vos réponses.
    Effectivement c'était juste un problème de portée. J'ai relu les cours sur le Php objet et j'ai tout de suite trouvé plusieurs solutions. J'ai opté pour utilisé le mot clé global pour que la variable $poeme soit visible par toutes les fonctions.
    Encore merci.
    Je bute sur un autre problème j'espère avoir votre aide ( de qualité en tout cas ). Je crée un autre sujet et j'espère vous relire.

    A bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/09/2013, 15h20
  2. [CakePHP] [Mock & model] Impossible d'accéder aux modèles d'autres contrôleurs
    Par benef dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 03/04/2013, 10h38
  3. Réponses: 0
    Dernier message: 11/02/2008, 09h49
  4. Champ de texte et MVC (modèle vue contrôleur)
    Par three minute hero dans le forum Windows
    Réponses: 1
    Dernier message: 22/02/2007, 11h04

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