Page 1 sur 1

MVC et cache : dans le contrôleur ou le modèle ?

Posté : 31 déc. 2008, 15:53
par savageman
Bonjour à vous,

Je me pose pleins de questions en ce moment :

Si j'utilise un système de cache dans une architecture MVC, est-ce le contrôleur qui doit mettre en cache ou le modèle peut également gérer une telle persistence ?

Si j'ai pas été assez précis, dites-le moi ! ;)

Merci d'avance pour la réponse,

Savageman.

Posté : 31 déc. 2008, 17:01
par katagoto
Tout dépend ce que tu veux mettre en cache, si tu veux mettre en cache les données c'est au modèle logiquement ? si non, c'est au contrôleur...

Posté : 01 janv. 2009, 03:50
par savageman
Oui, c'est des données... Mais c'est pour éviter des requêtes SQL pas forcément toujours utiles... Et dans la logique, le contrôleur peut aussi invalider un cache, donc bon : j'hésite !

Posté : 01 janv. 2009, 20:38
par fab
Moi je suis plutôt pour gerer le cache depuis le controleur

Posté : 02 janv. 2009, 12:11
par zeus
Si le cache concerne de l'affichage, c'est au contrôleur de le gérer, si le cache concerne de la persistance de données, c'est au modèle de le gérer.

Je m'explique : le contrôleur décide ce qui s'affiche, quand, comment. C'est lui qui doit savoir si ce qu'il doit afficher est déjà présent ou pas en cache et donc éviter de passer par le modèle et la vue.
Le modèle décide comment manipuler les données. Si ces données doivent être mises en cache, seul lui doit être au courant puisque le contrôleur peut utiliser ces données mises en cache pour plusieurs actions.

PS : comme toujours quand je parle de MVC, ça me semble très simple, mais quand je me relis, c'est un blabla immonde, alors n'hésitez pas à redemander. ;)

Posté : 02 janv. 2009, 14:03
par savageman
Merci des réponses, ça diverge un peu, mais on va pouvoir faire quelque chose. ^^

Utilisons des exemples, ça sera plus clair. ^^

Si par exemple, j'ai une liste de citations et que sur ma page d'accueil, je veux afficher une citation différente chaque jour, qui doit s'occuper du cache ?

Même question quand on invalide des données lors de l'édition d'une citation ou bien de la suppression d'une citation (car la liste des citations change, et donc la citation potentiellement affichée peut avoir changé/été supprimée).

C'est les termes persistance de données que j'ai du mal à saisir...

Posté : 03 janv. 2009, 11:04
par zeus
Ce que j'appelle la "persistance des données", c'est le fait de pouvoir mettre en cache des données du modèle. C'est à dire faire en sorte que le modèle n'ailles pas ré-interroger la base de données, le fichier, le web-service à chaque fois que la données est nécessaire. En gros, c'est un cache de données, contrairement au cache de rendu que je considère comme étant un travail du controleur.

Pour ton exemple, je pense que le cache peut se passer au 2 niveaux ...
Tout d'abord, en lisant ta description, je vois que c'est la citation, donc la donnée qui vient de base qui doit être cachée. Je me dit donc que c'est de la persistance de données et que c'est au modèle de faire ça.
Malgré tout, je me dit que si l'affichage final ne concerne que cette citation, tu pourrais demander au controleur de mettre en cache le rendu final, et le résultat serait le même, il y aurait juste un chouilla de traitement en moins.

Concernant l'invalidation des données, il y a plusieurs solutions :
- Soit tu gères le cache au niveau du modèle et toute modification sur une données en base invalide le cache, ce qui va forcer la ré-interrogation à la prochaine requête
- Soit tu acceptes qu'il y ait un delta où la citation affichée ne correspondra pas à celle modifié, et tu mets en cache le résultat.

N'hésite pas demander si je n'ai pas été clair.

Posté : 04 janv. 2009, 04:16
par Hywan
Hey :),

Zeus n'a pas vraiment donné la notion à laquelle je pense, j'aimerais apporter une précision.
Si le modèle est utilisé par seulement un contrôleur (une sorte de dépendance forte, genre une agrégation ou une composition), alors inutile de mettre le modèle en cache. Tu peux tout gérer dans le contrôleur, ce serait plus simple. En revanche, si le modèle est partagé par plusieurs contrôleurs, Zeus a bien expliqué la chose, il faut savoir où tu veux intervenir.
Soit tu ne veux pas exécuter 50 fois l'accès aux données (par exemple une requête SQL), dans ce cas tu mets le modèle en cache. Soit tu ne veux pas exécuter 50 fois le traitement des données, dans ce cas, tu mets le contrôleur en cache (quand je dis le modèle ou contrôleur en cache, je parle de leur traitement et pas de leur instance, bref c'est un détail, passons).

Maintenant, observons deux secondes le phénomène. Mon modèle me propose des données, et mon contrôleur les traite. Je ne veux pas faire le traitement 800 fois, donc je mets le résultat du traitement en cache. Donc, il est forcément utile de mettre également le traitement du modèle en cache, sinon tu ne fais que la moitié du travail.
Donc la façon de faire le cache sera important. Soit tu as une plage de code en cache : plusieurs lignes de code qui comprennent l'accès au modèle, l'obtention et le traitement du résultat, soit tu as une mise en cache atomique : c'est à dire traitement par traitement.

Tu as donc deux niveaux/concepts à te figurer, comme l'a précisé Zeus, qui sont influencés par ta façon de travailler.

Posté : 04 janv. 2009, 14:58
par savageman
Ok ! C'est plus clair comme ça !
C'est effectivement un couplage fort entre ce contrôleur et ce modèle. Ils font partis du même modules. ;)
Le traitement, on en a pas, c'est juste de la récup/affichage de données (et c'est le template qui met en forme et protège le XSS, on a pas de traitement particuliers dans le contrôleur...).