Bonjour,
Je cherche à créer un objet persistant. J'utilise symfony 1.4 et doctrine 1.2 ce qui peut expliquer certaines méthodes "bizarres" que je commenterais. Je pense que le problème est lié à mon architecture objet et pas à symfony ou doctrine c'est pourquoi je poste ici. Mais n’ayant pas trouvé l'origine...
Le problème est que les données ne sont pas persistantes. Pire, elle ne le sont même dans dans une même session.
Résumé de la classe parent :
Le code d'initialisation de l'objet pour l'application. Il est bien exécuté à l'initialisation.
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
31
32
33 abstract class mrParcour implements ArrayAccess, Serializable { /** * @var Doctrine_Query */ private $query_liste_base = null; ... public function __construct() { $this->configure(); } abstract public function configure(); public function setNameQueryListeBase( Doctrine_Query $q ) { $this->query_liste_base = $q; // un test ici laisse voir que la propriété est initialisée return $this; } public function initParcour() { if ( !is_null( $this->listeParcour ) ) return; $q = new Doctrine_Query(); $q->parseDqlQuery( $this->query_liste_base->getDql() ); ... return $this; } }
Un peu particulier à symfony, l'objet user possède un array d'argument qui est automatiquement sérializé dans les données sessions. C'est là qu'est sérialisé l'objet PersonneParcour et qu'il est récupéré
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 class PersonneParcour extends mrParcour { public function configure() { $this->setFiltreObjectNom( 'PersonneFormFilter' ); // Crée une requête doctrine et l'envoie à la méthode setNQLB() $this->setNameQueryListeBase( Doctrine_Core::getTable( 'Personne' )-> createQuery( 'p' )-> select( 'p.id' ) ); } }
a noter que l'objet mrParcour implémante l'interface serializable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class myUser extends sfGuardSecurityUser { public function getPersonnesPager() { // Retourne le pager s'il est en mémoire, si non, le crée return $this->getAttribute('personnel_pager', new PersonneParcour()); } public function setPersonnesPager( mrParcour $p) { $this->setAttribute('personnel_pager'); return $this; } }
Enfin le contrôleur
Avec des echos et autres die j'ai une bonne vision de ce qui se passe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public function executeShow( sfWebRequest $request ) { $this->parcour = $this->getUser()->getPersonnesPager(); $this->parcour->setFilterOffset($request->getParameter('id') ); $this->getUser()->setPersonnesPager( $this->parcour->initParcour() ); .... }
- Arrivée dans le contrôleur et récupération d'un objet.
- Premier passage donc création d'un nouveau
- - Initialisation du nouveau et méthode configure
- - Initialisation de la variable interne à l'objet :query_liste_base
- Imputation d'une autre valeur qui marche (l'imputation, je n'ai pas regardé la récupération).
- le contrôleur initialise le parcour (initParcour et récupère l'objet pour une mise à jour dans la base
- Dans l'objet, la variable query_liste_base est nul alors qu'elle contenait l'objet un peu plus tôt
A noter que j'ai essayé avec un champ texte et le résultat est null aussi.
La question est : pourquoi query_liste_base passe-t-il d'un objet lors de l'init à null un peu après ?
A noter que la méthode construct de l'objet n'est exécutée qu'une fois ce qui exclu que l'objet serait ré-instancié.
Quelqu'un a-t-il une idée de test et/ou d'explication ?
D'avance merci
Partager