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

Langage PHP Discussion :

[POO] Objet persistant qui perd la valeur de ces attributs [PHP 5.3]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut [POO] Objet persistant qui perd la valeur de ces attributs
    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 :
    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;
        }
    }
    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
     
    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' )
        );
      }
     
    }
    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
     
    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;
       }
    }
    a noter que l'objet mrParcour implémante l'interface serializable.

    Enfin le contrôleur
    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() );
        ....
      }
    Avec des echos et autres die j'ai une bonne vision de ce qui se passe :
    1. Arrivée dans le contrôleur et récupération d'un objet.
    2. Premier passage donc création d'un nouveau
    3. - Initialisation du nouveau et méthode configure
    4. - Initialisation de la variable interne à l'objet :query_liste_base
    5. Imputation d'une autre valeur qui marche (l'imputation, je n'ai pas regardé la récupération).
    6. le contrôleur initialise le parcour (initParcour et récupère l'objet pour une mise à jour dans la base
    7. 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

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    les classes sont bien serializable ?

  3. #3
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    MyUser oui, par héritage.
    mrParcour c'est implémenté (je n'ai pas mis le code mais il y est)
    le contrôleur non, mais cela n'a pas d'intérêt.

    Dans tous les cas je n'essaye même pas de récupérer l'objet sérializé, j'en suis à la première lecture...

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Faute de frappe dans la classe myUser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->setAttrubute('personnel_pager');

  5. #5
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Bien vu.

    Mais une rapide vérification m'a confirmé ce que je craignais, c'est une faute de rédaction, je ne sais pas comment un copié collé peut transformer un i en u, mais je soupçonne fortement mes doigts d'avoirs trainés là où il n'auraient pas eu.

    Le code comporte le bon nom de fonction. Et l'erreur aurait été facilement identifiable.

    Je soupçonne plutôt une erreur dans la logique de l'objet mrParcour et/ou de son implémentation. Mais je n'ai toujours pas trouvé où.

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Serait-ce possible d'avoir le code complet de mrParcour ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction qui retourne plusieurs valeurs !
    Par casafa dans le forum C++
    Réponses: 20
    Dernier message: 23/04/2014, 16h56
  2. Réponses: 2
    Dernier message: 18/12/2006, 00h37
  3. Variable qui perd sa valeur
    Par thierry-69007 dans le forum Delphi
    Réponses: 5
    Dernier message: 14/12/2006, 13h18
  4. Réponses: 4
    Dernier message: 05/12/2006, 11h52
  5. [POO] Objet par valeur
    Par seb34 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/08/2006, 22h49

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