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

Langage PHP Discussion :

[POO] Votre vision d'une implémentation MVC


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Par défaut [POO] Votre vision d'une implémentation MVC
    Bonjour,

    Je souhaiterais mettre en oeuvre ma propre implémentation du motif de conception MVC lors du déploiement d'une application web professionnelle. Je sais déjà qu'il existe de nombreux frameworks éprouvés sur la toile et je suis d'ailleurs un grand fan de codeigniter que je trouve très intuitif.

    Tous les frameworks disponibles sur internet ont l'énorme avantage de pouvoir fonctionner dans des environnements divers en effectuant beaucoup de vérifications pour voir si telle ou telle fonctionnalité est supportée par le serveur sur lequel ils sont exécutés. Or, c'est un effet à double tranchant : Cette nécessité de compatibilité fait qu'ils requièrent un surplus de calculs dont j'ai besoin de m'affranchir.

    Je souhaiterais donc mettre en oeuvre un simple modèle de conception MVC destiné à être utilisé sur mes serveurs et n'ayant pas à se préoccuper de l'environnement dans lequel ils seront exécutés.

    Ma question est donc la suivante : Quelle méthodologie utiliseriez vous pour implémenter un modèle MVC ? Quels patrons utiliseriez-vous pour créer votre contrôleur frontal, vos contrôleurs, vos modèles et vos vues ? Qu'est-ce qui se pratique couramment ?

    Merci d'avance pour vos points de vue !

  2. #2
    Membre émérite Avatar de sharrascript
    Homme Profil pro
    Développeur Web indépendant
    Inscrit en
    Avril 2007
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web indépendant

    Informations forums :
    Inscription : Avril 2007
    Messages : 678
    Par défaut
    Salut alejandro,

    Je suis tombé sur le même objectif que toi, il y a de cela quelques mois, c'est pour cette raison que je me suis confectionné un petit framework perso sous le model MVC qui s'approche le plus prêt possible de ma logique. Le framework fonctionne, mais est encore à l'état d'embryon. Chaque nouveau cas me permet de le remettre en cause et de le remodeler.

    Je suis parti de ma logique personnelle et bien entendu de ce qui se fait (ZF, Jelix, Copix, surtout ceux là), puis j'ai développé le tout autour d'un projet gabarit, ce qui m'a permis de voir et de tester.

    Je n'ai pas de réel conseil à donner sachant que mon projet n'est peut être pas une référence, mais le résultat est concluant, j'ai un framework PHP MVC que je connais sur le bout des doigts et qui est adapté à l'environnement que j'utilise et maitrise.

    Tout ce que je peux te dire, c'est qu'il y a du boulot, mais que le résultat est intéressant et peut devenir très productif.

    Bonne journée ++

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Je souhaiterais donc mettre en oeuvre un simple modèle de conception MVC destiné à être utilisé sur mes serveurs et n'ayant pas à se préoccuper de l'environnement dans lequel ils seront exécutés.
    Peux-tu etre plus explicite car l'environnement ne peut être ignoré.
    Il faut avoir une feuille de route pour pouvoir décider de l'implémentation.

    Si c'est juste le MVC que tu veux et pas tous les avantages que peux t'apporter un Framework. Tu peux créer 3 dossiers:
    /models
    - DB.class.php (Abstrait l'accés a la base)
    - Article.class.php
    - ...
    /views
    /article
    - list.php
    - edit.php
    /controllers
    controller.php (Class fournissant les prérequis pour les controleurs)
    article.php

    ton index.php peut prendre en paramètre le controleur + action a effectuer
    index.php?c=article&a=list

    Si j'étais toi j'opterais plutôt pour un Framework léger qui serait compatible avec tes serveurs.

  4. #4
    Membre confirmé Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Par défaut
    Merci pour vos réponses, mon environnement est structuré comme suit : mes serveurs peuvent accueillir jusqu'à une centaine de domaines chacun. Chaque domaine contient pour l'instant deux fichiers qui sont un .htaccess et un fichier index.php.

    Mon .htaccess est plutôt simple, il redirige toutes les requêtes vers index.php sauf celles qui concernent les fichiers à télécharger tels que les images, les fichiers pdf, les animations flash etc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RewriteEngine on
    RewriteBase /
    RewriteRule !\.(js|ico|txt|gif|jpg|png|css|swf)$ index.php
    Ensuite j'ai deux dossiers supplémentaires qui ne sont pas localisés dans les domaines, il s'agit du dossier application et du dossier framework. Le dossier framework contient mon framework et mon dossier application ... mon application

    Lorsque je met à jour mon dossier application, tous mes domaines sont mis à jour en même temps, et c'est là mon but premier, car effectuer des mises à jour hebdomadaires sur des centaines de domaines ... je vous passe la suite.

    Ensuite mon framework possède un autoloader (fonction PHP5) qui transforme une requête de classe de type Default_Bootstrap en Default/Bootstrap.php et qui va donc inclure ma classe automatiquement.

    Mon dossier framework contient principalement des patrons de conception sous forme de classes abstraites et d'interfaces. Il contient également un lot d'outils divers dans un dossier par défaut.

    Mon dossier application contient un fichier de configuration pour mon application et trois dossiers pour l'instant : Model, View, Controller.

    Je pensais utiliser un patron de conception de type "strategy" pour mes contrôleurs par exemple et un modèle "composite" pour mes vues afin de pouvoir moduler chaque partie de l'interface utilisateur sous forme d'options (je souhaite activer telle option sur tel domaine - par ex. une carte interactive - mais pas sur tel autre).

    C'est surtout sur cela que porte ma question, il existe plein de façon d'implémenter MVC et je voulais avoir votre vision d'une implémentation MVC, quels patrons de conception utilisez-vous pour vos vues, vos contrôleurs, vos modèles, votre contrôleur frontal ... ?

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    C'est un très bon reflex que d'utiliser les Design Pattern pour concevoir ton appli cependant fait attention de ne pas trop compliquer la conception. Autant pour un site web, je suis à fond pour une architecture poussée. Mais là tu risques de te prendre les pieds dans le tapis avec de nombreuses exceptions à gérer.

    Pour le controlleur une classe abstraite avec tes méthodes de base genre
    preExecute, postExecute

    Pour ta base de données, tu pourrais utiliser soit un ORM existant.
    - Doctrine
    - Propel
    - ...
    Ou bien utiliser le pattern Active Record

    Pour les vues j'irai au plus simple, un truc à la Smarty devrait faire l'affaire
    (en plus light).

  6. #6
    Membre confirmé Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Par défaut
    Merci pour vos réponses, je pense avoir trouvé un modèle de conception intéressant dans toutes les docs que j'ai lu et je voulais avoir votre avis sur un contrôleur frontal comme celui-ci :

    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
    37
    38
    39
    40
    41
    42
    43
    if( ! class_exists( 'Front_Controller' ) )
    {
        final class Front_Controller
        {
            private static $o_Instance = NULL;
            private $h_Filters = array();
            private $o_Strategy = NULL;
     
            private function __construct()
            {
                $this->RegisterFilter( new Front_Controller_Output );
            }
     
            private function RegisterFilter( & $o_Filter )
            {
                $this->h_Filters[] = & $o_Filter;
            }
     
            public static function GetInstance()
            {
                if( ! self::$o_Instance instanceof self )
                    self::$o_Instance = new self;
     
                return self::$o_Instance;
            }
     
            public function Execute()
            {
                foreach( $this->h_Filters as $o_Filter )
                {
                    $o_Filter->PreProcess();
                }
     
                // $this->o_Strategy->Execute() :
                echo "bonjour";
     
                foreach( array_reverse( $this->h_Filters ) as $o_Filter )
                {
                    $o_Filter->PostProcess();
                }
            }
        }
    }
    Il fonctionne avec les patrons de conception Intercepting Filters, Singleton et Strategy. Je commence par rajouter mon interface pour les filtres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if( ! interface_exists( 'Front_Controller_Filter' ) )
    {
        interface Front_Controller_Filter
        {
            public function PreProcess();
            public function PostProcess();
        }
    }
    Puis je crée par exemple un filtre Front_Controller_Output qui va être capable d'agir sur ma sortie (dans l'exemple je met ma sortie en italique ) :

    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
    if( ! class_exists( 'Front_Controller_Output' ) )
    {
        class Front_Controller_Output
        implements Front_Controller_Filter
        {
            public function PreProcess()
            {
                ob_start();
            }
     
            public function PostProcess()
            {
                echo "<i>" . ob_get_clean() . "</i>";
            }
        }
    }
    Je peux imaginer en faire autant avec mes sessions, mes droits d'accès aux ressources etc. Ensuite à la place d'écrire "bonjour", je dois analyser mon URL et lancer le contrôleur correspondant avec $this->o_Strategy->Execute();

    Que pensez-vous de cette approche qui m'a l'air plutôt élégante ?

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Franchement c'est dur a dire, cela dit ca correspond plus ou moins a ce qui se fait dans d'autres Frameworks.

    En tout cas tiens nous au courant de tes avancés.

Discussions similaires

  1. [POO] C'est quoi une classe en claire...???
    Par Spack dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 26/01/2009, 16h53
  2. Votre avis sur une proposition de job
    Par plex dans le forum Emploi
    Réponses: 7
    Dernier message: 18/01/2007, 11h11
  3. J'ai besoin de votre aide pour une requête
    Par ovdz dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/05/2005, 12h42
  4. Votre avis sur une bannière animée developpez.com
    Par Marc Lussac dans le forum Evolutions du club
    Réponses: 14
    Dernier message: 02/02/2005, 08h52

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