Hello,
Cette question ne se limite pas forcément au PHP, mais comme c'est le langage sur lequel je suis parti je crée mon topic ici. Le problème est le suivant : comment faites-vous (ou feriez-vous) pour manipuler (créer ou modifier) des objets "complexes" dans un site ?
Par "objet complexe", je veux dire autre chose qu'un objet qui possède simplement une liste de champs scalaires qui ne dépendent pas les un des autres, et qui peut donc être créé en une seule étape. Par exemple, prenons un objet "Carnet" qui contient une liste d'objets "Contact". Ma classe "Contact" dérive en "Entreprise" et "Particulier" qui ne contiennent pas du tout les mêmes informations. On peut alors imaginer un formulaire qui me propose de créer un "Carnet", avec un bouton pour ajouter un nouveau contact. Il faut ensuite choisir le type de contact ("Entreprise" ou "Particulier"), et en fonction de ce choix les informations qui me seront demandées ne seront pas les mêmes. Mon formulaire ne peut donc pas être constitué d'une seule page, il y en aura au minimum 2, et l'objet "Carnet" en cours de construction doit être persistant entre les deux.
Voici les solutions que je connais, et les inconvénients de chacune :
- On peut enregistrer l'objet "Carnet" en cours de construction avec la même couche de persistance (fichier plat, base SQL...) que celle utilisée pour conserver tous les "Carnet"s créés. Le problème c'est que si l'utilisateur interrompt la création en cours de route, on aura un objet temporaire dans la base qui ne sera pas automatiquement nettoyé. On peut toujours lui mettre un flag "est_temporaire" et purger les objets temporaires à intervalles réguliers, mais il faut ordonnancer une tâche dédiée à ça, et je ne trouve pas cette solution très élégante.
- On peut enregistrer l'objet "Carnet" en cours de construction dans une session. Mais je n'aime pas trop les sessions, principalement parceque c'est incompatible avec la navigation par onglets (tous les onglets partagent la même session, donc si on essaie de créer deux objets simultanément, il y en a un qui écrase l'autre). On peut tricher un peu et créer des "contextes de session" pour gérer plusieurs onglets, mais ça devient compliqué.
- On peut sérialiser l'objet "Carnet" en cours de construction et le passer en POST à travers les différentes pages du formulaire. Ça gère les onglets multiples et ça ne laisse pas de saletés si on interrompt la création en plein milieu. En revanche, il faut être très vigilant niveau sécurité puisque l'utilisateur peut facilement trafiquer l'objet entre deux pages, et ça peut être rapidement très lourd puisqu'il faut répéter un champ POST potentiellement long à chaque <form> contenu dans la page (et quand il y en a une dizaine, ça finit par se sentir).
Quelle est la solution qui vous semblerait la meilleure parmi celles-ci, et si vous en connaissez une (ou plusieurs) autre(s), quelle(s)-est/sont elle(s) ?
Merci