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

Bibliothèques et frameworks PHP Discussion :

Question sur le MVC


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 233
    Points : 107
    Points
    107
    Par défaut Question sur le MVC
    Bonjour,

    Je fais appel a votre expérience pour vous poser une question concernant la facon (ou plutot l'endroit) ou se trouvent les requetes lorsqu'on developpe une application web avec le pattern MVC.

    Je vous répondrais bien : "Les requêtes se trouvent dans le model" ...

    Mais depuis que je pratique du MVC je vois tout et n'importe quoi que çà commence a me destabiliser.

    La par exemple je reprends une application d'un de mes anciens collègue que j'estime calé en dev. Application réalisée avec le framework Kohanna.

    Et que vois - je ?

    Des requetes basées sur un ORM qui se trouvent dans ses controlleurs ...

    Exemple :

    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
     
    	public function action_ajax_lister()
    	{
            // recupere les informations utilisateur
    		$u = Session::instance()->get('infos_gestionnaire');
     
    		$utilisateur = ORM::factory('Utilisateurs')
    			->where('uid', '=', $u['uid'])
    			->find();
     
    		// recupere les informations depot
    		$id_depot  = $_GET['depot-id'];
     
    		$depot = ORM::factory('Depots')
    			->where('id_gestionnaire', '=', $utilisateur->id)
    			->where('id', '=', $id_depot)
    			->find();
     
    		//var_dump($affectations->as_array());
    		$utilisateurs = $depot->utilisateurs
    			->order_by('nom', 'asc')
    			->order_by('prenom', 'asc')
    			->find_all()->as_array();
     
    		// preparation du resultat JSON
    		$o = new stdClass();
     
    // etc 
    // etc ...
        }

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 103
    Points : 4 449
    Points
    4 449
    Par défaut
    Bonjour,

    Oui c'est normal
    on ne va pas écrire une méthode dans le model pour Model->findByID(4)
    ou ce findAll() avec order

    C'est donc tout a fait classique pour un petit-moyen site

    Sinon il existe une méthode "lourde" :
    les repository
    les requetes sql ne sont pas dans les model ni dans les controleurs mais dans les repository
    la, le controleur ne voit plus l'orm mais agit que sur le repository(pas le model), donc le code controleur est indépendant de l'orm
    $moi= ( !== ) ? : ;

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Le rôle du contrôleur est de réagir à une requête get/post en appellant la logique métier qui correspondent à la requête et ensuite à appeler la vue qui doit afficher les résultats de cette logique. Converser avec la base de données est une responsabilité qui ne devrait pas lui appartenir (ORM ou pas ORM).

    De plus, cela crée une dépendence significative entre controlleur et données.

    Et si on a besoin de réutiliser la même logique (ou une logique proche) dans d'autres contrôleurs, le résultat sera une duplication inutile de code.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 233
    Points : 107
    Points
    107
    Par défaut
    Voilà, papajoker et Tsilefy ont des avis qui diffèrent

    Cette notion de dépendance évoquée par Tsilefy me semble être un point fort.

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 103
    Points : 4 449
    Points
    4 449
    Par défaut
    Citation Envoyé par boutmos Voir le message
    Voilà, papajoker et Tsilefy ont des avis qui diffèrent
    Non je suis a 90% avec Tsilefy (voir plus)

    tu n'as pas compris : soit une méthode controleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fonction getUser(){
       $user = new ModelUser();
       $data= $user->find( $_GET['id']  );
       return View->render(  $data );
    }
    cette méthode utilise un ORM(ModelUser) et une requete de l'orm(find)
    et ca ne me choque pas trop !

    Bien sur il faut comprendre que ce code est exactement le même que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return View->render(  ORM::factory('user')->find($_GET['id']) );
    c'est juste une petite différence d'écriture.

    --------------
    et je précise pour un appel simple (une seule méthode), pas d’enchaînements, ca ne me pose pas de probleme.

    dans l'exemple il y avais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $depot = Depots::where('id_gestionnaire', '=', $utilisateur->id)
    			->where('id', '=', $id_depot)
    			->find();
    $utilisateurs = $depot->utilisateurs
    			->order_by('nom', 'asc')->order_by('prenom', 'asc')
    			->find_all()->as_array();
    ce qui me "choque" en premier lieu c'est l’enchaînement qui est clairement une dépendance métier, les requêtes, en deuxième.

    ----------------------
    Je pense que la bonne réponse dépend du projet :
    un projet a long terme (x personnes sur x années) ou une personne sur 15 jours sans maintenance.
    D'un package(bundle) ou d'un code diffus dans un développement.
    $moi= ( !== ) ? : ;

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par boutmos Voir le message
    Je vous répondrais bien : "Les requêtes se trouvent dans le model" ...

    Mais depuis que je pratique du MVC je vois tout et n'importe quoi que çà commence a me destabiliser.
    Comme quoi il y a la théorie et la pratique...
    MVC c'est un principe d'architecture mais suivant le cahier des charges de l'application chacun peut faire quelques exceptions dans cette organisation au cas par cas ou utiliser une variante généralisée à tout le développement.

    On fait des exceptions bien souvent parce que c'est plus simple/optimisé par rapport au contexte. Bien entendu cela peut induire les inconvénients que Tsilefy a indiqué mais un développeur averti ne le fera qu'en connaissance de cause et en fonction des paramètres : temps de développement - optimisation code - évolution, qui sont eux-mêmes contradictoires.

    Autrement dit et si comme tu le dis ce code provient d'un développeur chevronné, il a sans doute pensé que la dépendance induite dans le contrôleur n'était pas gênante pour cette application et/ou la fonction est peut-être difficile à reporter dans le modèle pour des problèmes d'organisation ou d'optimisation du code.

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 233
    Points : 107
    Points
    107
    Par défaut
    Ok merci pour votre participation. C'est toujours interessant de voir des réponses claires qui sortent un peu de la définition pure du model MVC mais qui sont justifiées.

    @papajoker : Je comprends mieux ton point de vue avec ta seconde explication

    Si vous souhaitez continuer a alimenter ce fil et faire part de votre propre expérience en developement MVC, allez y de bon coeur

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Il faut respecter les bonnes pratiques, mais après, comme les autres l'ont dit, il y a une réalité dont il faut tenir compte.

    La réalité, c'est:
    - si je suis à 100% sûr que mon controlleur n'évoluera plus jamais, je peux rajouter une petite couche métier à l'intérieur.
    - si le client me paie pour développer rapidement un truc qui marche, sans se soucier s'il est évolutif ou pas, s'il sera facile à maintenir ou pas, qui suis-je pour le lui refuser, à partir du moment où il est au courant de tous les faits?

    Le tout c'est d'éviter le cercle infernal (et je parle d'expérience):
    - tiens, j'ai besoin d'une petite fonctionnalité dans mon controleur, je vais l'ajouter ici, je ne vais pas modifier le modèle pour ça.
    - Tiens, j'ai aussi besoin d'une autre fonctionnalité dans cet autre controleur. Tant qu'on y est, continuons à le modifier ici, après tout ce n'est qu'un petit accroc aux bonnes pratiques, l'essentiel c'est que ça marche.
    - tiens, je me retrouve avec des méthodes qui font plusieurs dizaines de lignes et qui partagent plus ou moins le même code, avec des appels à l'ORM, du logging, des APIs. Il va falloir que refactorise tout ça.
    - [un an passe... entre-temps, je suis passé à d'autres projets sur d'autres frameworks]
    - tiens, la vielle application a besoin d'une nouvelle fonctionnalité. J'ouvre le projet dans Netbeans et je peste: qui a écrit ce code déguelasse et difficile à comprendre et à modifier?

Discussions similaires

  1. Question sur le MVC
    Par S4milli4 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 23/01/2012, 17h01
  2. question sur logique MVC
    Par Finality dans le forum ASP.NET MVC
    Réponses: 7
    Dernier message: 21/04/2011, 13h12
  3. Question sur le MVC, conception et objet metier
    Par magiczouf dans le forum MVC
    Réponses: 0
    Dernier message: 17/07/2009, 11h02
  4. Petite question sur le MVC
    Par Mogwaï dans le forum MVC
    Réponses: 5
    Dernier message: 21/08/2008, 16h38
  5. Question sur le MVC
    Par Invité dans le forum MVC
    Réponses: 2
    Dernier message: 12/05/2007, 17h09

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