[RESOLU] Problème PHP - POO - MVC

Petit nouveau ! | 2 Messages

19 nov. 2016, 13:57

Bonjour à tous,

Je suis en train de créer un site en PHP en utilisant le modèle MVC.

Cependant, je bloque sur certains points. Je tient à précisez que mon problème ne consiste pas dans la syntaxe du PHP, mais dans la mise en place du modèle MVC.

Résumé de la situation :

index.php > routeur.php > controleur.php > vue.php (contenant un formulaire redirigeant vers index.php)

index > création d'un routeur : appelle la methode de redirection de routeur.php

routeur > création d'un controleur : contient une methode redirection qui execute differentes tâches vers le controleur

controleur > création d'une vue et du modèle.

Or quand je valide le formulaire de vue.php, je suis redirigé vers index.php qui recrée un nouveau routeur et donc un nouveau controleur et donc un nouveau modèle.

Cependant, je stocke des infos dans le modèle et je ne peut donc pas les récuper par la suite car il est recréer à chaque fois .

Avez vous une solution ?

Merci d'avance pour votre aide.

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8747 Messages

21 nov. 2016, 11:33

salut,

ce que tu indiques est inhérent à php, qui ne garde pas de chose en mémoire une fois code terminé (contrairement à java, par exemple, qui a sa jvm de montée en mémoire et contiendra la mécanique de ton MVC en mémoire).

Dans le cas de PHP il faut tout recréer à chaque appel. Si tu as besoin de garder des données utilisateurs il faut utiliser les sessions.
Le modèle c'est l'image de la bdd donc si tu "sauvegarde des choses dans le modèle" c'est une sauvegarde en base donc il n'y a pas de problème à les réemployer (sauf si tu as des transactions, sans commmit automatique et que tu ne commit pas explicitement (ce n'est pas la conf généralement utilisées).

Pour chaque requête il faut que tu ais (généralement dans l'url) l'information du routage.
je te conseil d'utiliser l'url rewriting pour cela.
par exemple
[*] http://tonsite.com/login => route pour la connexion
[*] http://tonsite.com/profil => route pour afficher le profile

coté ré écriture d'url tu redirige le tout vers l'index => index.php?action=$1
tu as ainsi toujours l'infos pour le routeur et donc démarrer le contrôleur.
Si dans tous cela il y a besoin d'information lié à l'utilisateur il faut utiliser les sessions. (en gros user_id, acl).

dans le cas que tu sites (je prend le cas du formulaire de connexion)
<form method="post" action="/authenticate">
</form>
la régle de réécriture
RewriteRule "/(.+)" "/index.php?action=$1" [QSA]
la doc du mode rewrite : http://httpd.apache.org/docs/current/mo ... write.html

dans index.php tu vérifies crée le routeur (factory et méthode statique) auquel tu passes le contenu de $_GET['action'] (si existe sinon une chaîne vide).
dans le routeur le plus propre étant une chaîne de commandement (plutôt qu'un gros switch ou série de if / else if /else). Je te laisse demander à google si tu ne connais pas ce "design pattern" ;)

Le contrôleur sais ce qu'il doit faire (utiliser $_GET / $_POST pour traiter le formulaire, utiliser la session etc.).

Si c'est ce que tu as fait, alors tu as fait "ce qu'il fallait" tu n'as pas beaucoup d'autre solution.
Le chargement des objets routeur, contrôleur ou vue ne sont pas super coûteux comparé à ce que tu leur demandes de faire (connexion à la base de données requêtes plus ou moins complexe, envoie de mail, connexion ftp ou autre et gérération du html voir utilisation et parse de template html).

Si tu as vraiment besoin d'un quelconque état il faut utiliser les sessions (je te déconseille la sérialisation des objets en session, c'est coûteux et généralement peu utile).


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 2 Messages

21 nov. 2016, 12:12

Bonjour moogli,
Merci beaucoup pour ta réponse constructive. Elle m'à beaucoup aidée, et je vais donc stocker mes donnees en variable de sessions. Concernant la chaîne de commendement, je vais me renseigner car je ne connais pas du tout.
Merci beaucoup !