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 :

Bonne pratique MVC & POO


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2010
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 29
    Points : 25
    Points
    25
    Par défaut Bonne pratique MVC & POO
    Salut à tous,
    Après multe recherche je me suis un peu perdu sur la façon d'appliquer le modèle MVC en PHP et j'en ai ressortie plein d'interrogation

    Intro
    Je doit concevoir un site assez dynamique avec à peu près 25-30 objets que je vais retrouver en base de données ainsi qu'en Classes PHP.
    Exemple:
    - Region
    - Pays (situé dans une région)
    - Ville (situé dans un pays)
    - entreprise (situé dans une ville)
    Plus tant d'autre dont je ne parlerais pas ici.


    PHP Objet
    Voila ce que je compte faire en terme d'objet
    Classes Entreprise, Region, Ville, Pays
    Maintenant comment refleter les liens entre ces objets :
    A. creer un objet Array de classe Ville dans la classe Pays ?
    B. creer un objet Array de noms de ville dans la classe Pays ? (pas vraiment POO)
    C. creer un objet de classe Pays dans la classe Ville (lien vers le père) ?

    Si ca dépend de mon utilisation, je peux pas trop répondre pour le moment mais je vais ensuite rattacher d'autres entités à celle ci.

    Modèle Vue Controller
    Ensuite en terme de design General MVC pour simplifier mon code source je suis parti de ce principe :
    - Dossier Classes (1 fichier par classe contenant uniquement le data model, ex: ville.class.php)
    - Dossier Pages : contenant les main controller avec dedans l'appel de procedure/fonc dependant de l'interraction (IF POST variable then .. else print formulaire ...
    - Dossier View : contenant l'ensemble des fonction d'affichage des objet avec le code HTML (les page incluront donc les view nécessaires)

    J'attend déjà vos remarques sur ce principe.

    POO & BDD
    Une autre colle maintenant : mes fonction de création d'objet et interaction database. je sais pas trop ou les mettre:
    exemple de méthode : loadfromdatabase, savetodatabase ?
    - dans des fichier séparés ? 1 fichier par classe (ex: Ville.database.php) ?
    - dans la classe elle même car intimement lié ?
    Structuration dis moi si ma logique convient:
    dans la page (le controller) j'appel la fonction $Array = getFromDatabase($id)
    ensuite je construit mon objet $myEnterprise = new Enterprise($Array)
    ou alors directement le faire dans la fonctione DB qui construirai l'objet, ainsi dans le controller:
    $myEnterprise = getFromDB($id)

    Voila, j'espère avoir été assez claire sur les questions que je me pose.

    Merci pour vos retour.

  2. #2
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    As tu le droit d'utiliser un Framework ? Je suppose que non, sinon toutes tes questions seraient résolus je pense . Mais rien ne t'empêche de regarder comment fonctionnent certains Framework, ça te donnera des bonnes idées je pense.

    Je pense que dans l'ensemble, ta vision du problème est plutôt bonne, et tu es sur la bonne voie, car tu te poses les bonnes questions.

    PHP Objet
    Entre A et C, souvent pas facile de choisir, et effectivement, cela dépend de ton utilisation. Après, on voit parfois les deux, même si c'est pas super joli (deux classes totalement dépendantes l'une de l'autre), mais c'est pratique.

    MVC
    Bonne décomposition de base.
    Mais tu verras à l'usage que tu auras surement envie d'avoir d'autres répertoires... Par exemple, plutôt que de mettre toute ta logique métier dans ton contrôleur, il peut être intéressant de créer des classes "Service" ou "Métier", réutilisables facilement par plusieurs contrôleurs.

    POO & BDD
    En général pour ça, on crée des fichiers "DAO" (Data access object).
    Mettre cette logique d'accès aux données dans la classe elle-même (ville.class.php par exemple), peut marcher, mais en général, c'est plutôt une mauvaise idée. Les objets de ce type peuvent très bien être indépendant de l'accès aux données. D'ailleurs, tu pourrais très bien en avoir certains qui ne correspondent pas directement à une table dans ta BD. De plus, si demain si tu as une nouvelle source de données, ou que certains sont enregistrées dans une base MySQL et d'autres proviennent d'un fichier XML par exemple... Et que faire également, si tu as une méthode DAO qui implique plusieurs objets, et non un seul ("deleteAll() par exemple).
    La solution $myEnterprise = getFromDB($id) est la meilleure assurément. Mais c'est celle qui demande le plus de travail au départ, car il faut gérer le "fetching" ligne BD=>objet PHP.
    L'idée est que la plupart des requêtes de base peuvent être générées automatiquement à partir de la structure de tes données, si celle-ci est connue. Par exemple, si tu sais quelque part qu'un user c'est un id (int), un login(string), un password (string), et que ta clé primaire c'est 'id', tu peux facilement créer les méthodes d'insertion, suppression, édition, voire recherche.
    En gros, à partir d'une définition d'une classe d'objet, tu peux très bien avoir un code générique qui marche pour tout, et qui te permettra de gagner du temps pour chaque objet... Mais ce n'est qu'une suggestion, tu peux aussi recoder à chaque fois ton "INSERT INTO ..." pour chaque objet (bon courage cela dit, c'est fastidieux et long à tester si tu as 25-30 classes)...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2010
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    merci, ça m'a conforté dans mon modèle.

    Je part sur donc sur ce principe, par contre je vais pas implémenter le modèle générique d'accès aux données utile en cas de sources multiples.

    Je part donc sur :
    > Entity.class.php (juste le data model) avec constructeur depuis un Array
    > Entity.db.php : retourne un array après avoir fait un select
    > Entity.view.php : pour les print, affichage html, formulaires etc. et éléments concernant la dite entité (liste etc...)
    > index.php : design mise en forme css ...
    > ControllerN.php = page inclue dans l'index qui appellera diverse fonctions
    > BusinessN.core.php pour les fonctions d'interactions multi objet un peu touchy (que j'ai a pas commencé, je verrais au fur et à mesure)

    Exemple de code au final dans le controller Entity.php:

    $objArray = getEntityFromDB($_GET['id']); -- necessite Entity.db.php
    $myEntity = new Entity($objArray); -- necessite Entity.class.php
    echo_account($customer); -- necessite Entity.view.php

    De toute façon ca va se complexifier très vite mais je pense partir sur une bonne base là

    Merci encore

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    je te conseil plutôt de partir sur une base plus "classique", que de mettre des extension au fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Controller
        VilleController.php
        RegionController.php
    Entity
        Ville.php
        Region.php
    View
        ville
            index.php
        region
            index.php

Discussions similaires

  1. Bonnes pratiques pour la POO en Javascript
    Par piemur2000 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 05/10/2013, 15h33
  2. [Bonne Pratique] MVC / JAVA
    Par javan00b dans le forum Interfaces Graphiques en Java
    Réponses: 0
    Dernier message: 13/05/2013, 02h48
  3. Bonnes pratiques et feedback sur MVC
    Par SPKlls dans le forum MVC
    Réponses: 7
    Dernier message: 23/06/2009, 15h25
  4. Réponses: 5
    Dernier message: 08/06/2009, 23h21
  5. [POO] Bonnes pratiques href="javascript:fonction()"
    Par LhIaScZkTer dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 04/04/2009, 18h26

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