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

PHP & Base de données Discussion :

[Doctrine] Surcharger une méthode gérée par __call()


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Par défaut [Doctrine] Surcharger une méthode gérée par __call()
    Bonjour,

    je débute avec symfony/doctrine qui fait une utilisation massive de _call() pour gérer les accesseurs getXXX() et setXXX().

    J'aimerai modifier le résultat d'un de ces accesseurs pour un champ particulier mais je n'arrive pas à accéder à la méthode "parente" qui n'existe pas. Aucun de ces deux codes ne fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function getChamp()
      {
        return $this->getChamp() . " TEST";
      }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function getChamp()
      {
        return parent::getChamp() . " TEST";
      }
    Existe-t-il un moyen de faire cela ? Sinon quelle alternative ?

    Je pourrai bien sur nommer différemment ma méthode getChamp mais cela m'embete car j'aimerai que ça fonctionne comme une surcharge pour que ca se répercute partout à je fais déjà appel à cet accesseur...

  2. #2
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Je n'ai pas trop regardé par rapport à Doctrine, toujours est-il que si tu as un getChamp() dans une classe dérivée et un __call() dans une classe parent, alors ces 2 alternatives fonctionnent (avec php5.3 en tout cas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    parent::getChamp();
     
    parent::__call('getChamp', func_get_args());

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Normallement avec doctrine les champs sont accessibles directement dans du dossier model.

    Tu as juste a faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function getChamp()
      {
        return $this->champ. " TEST";
      }

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Par défaut
    Merci pour vos réponses, mais ça ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public function getLargeur()
    {
      $args = func_get_args();
      return parent::__call('getLargeur', $args) . 'm';
    }

    --> J'obtiens une page blanche dans le navigateur, aucun message d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function getLargeur()
    {
      return $this->largeur. "m";
    }
    --> Erreur indiquant que le champ $largeur n'existe pas.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Peux-tu poster ton schema.yml, juste la partie avec ton objet.
    Peux-tu aussi poster ton objet.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Par défaut
    Voici mon schéma (partiel) :

    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
    34
    35
    36
    37
    38
    39
    40
    41
     
    myapp_item:
      actAs: { Timestampable: ~ }
      columns:
        id:
          type: integer(4)
          autoincrement: true
          primary: true
        types_id:
          type: integer(4)
          notnull: true
        categories_id:
          type: integer(4)
          notnull: true
        users_id:
          type: integer(4)
          notnull: true
        reference:
          type: string(32)
          notnull: true
          unique: true
        surface:
          type: float
        created_at:         ~
        updated_at:         ~
      relations:
        myapp_types:
          local: types_id
          foreign: id
          onDelete: RESTRICT
          onUpdate: CASCADE
        myapp_categories:
          local: categories_id
          foreign: id
          onDelete: RESTRICT
          onUpdate: CASCADE
        myapp_users:
          local: users_id
          foreign: id
          onDelete: RESTRICT
          onUpdate: CASCADE
    Mon objet :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    <?php
    abstract class Basemyapp_item extends sfDoctrineRecord
    {
        public function setTableDefinition()
        {
            $this->setTableName('myapp_item');
            $this->hasColumn('id', 'integer', 4, array(
                 'type' => 'integer',
                 'autoincrement' => true,
                 'primary' => true,
                 'length' => '4',
                 ));
            $this->hasColumn('types_id', 'integer', 4, array(
                 'type' => 'integer',
                 'notnull' => true,
                 'length' => '4',
                 ));
            $this->hasColumn('categories_id', 'integer', 4, array(
                 'type' => 'integer',
                 'notnull' => true,
                 'length' => '4',
                 ));
            $this->hasColumn('users_id', 'integer', 4, array(
                 'type' => 'integer',
                 'notnull' => true,
                 'length' => '4',
                 ));
            $this->hasColumn('reference', 'string', 32, array(
                 'type' => 'string',
                 'notnull' => true,
                 'unique' => true,
                 'length' => '32',
                 ));
            $this->hasColumn('surface', 'float', null, array(
                 'type' => 'float',
                 ));
            $this->hasColumn('created_at', '', null);
            $this->hasColumn('updated_at', '', null);
        }
     
        public function setUp()
        {
            $this->hasOne('myapp_types', array(
                 'local' => 'types_id',
                 'foreign' => 'id',
                 'onDelete' => 'RESTRICT',
                 'onUpdate' => 'CASCADE'));
     
            $this->hasOne('myapp_categories', array(
                 'local' => 'categories_id',
                 'foreign' => 'id',
                 'onDelete' => 'RESTRICT',
                 'onUpdate' => 'CASCADE'));
     
            $this->hasOne('myapp_users', array(
                 'local' => 'users_id',
                 'foreign' => 'id',
                 'onDelete' => 'RESTRICT',
                 'onUpdate' => 'CASCADE'));
     
     
            $timestampable0 = new Doctrine_Template_Timestampable();
            $this->actAs($timestampable0);
        }
    }
    J'ai finalement opté pour une nouvelle méthode (nom différent). Mais si la chose est techniquement possible, ça m'intéresse toujours.

    Merci pour votre aide.

Discussions similaires

  1. Surcharger une méthode
    Par daddycorp dans le forum Langage
    Réponses: 6
    Dernier message: 16/12/2008, 10h55
  2. Appel d'une méthode java par le biais d'un lien
    Par Lex92 dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 02/07/2008, 13h17
  3. Réponses: 2
    Dernier message: 27/02/2008, 17h22
  4. "Dé-surcharger" une méthode native javascript
    Par Takezo1584 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/08/2007, 12h37
  5. Supprimer une méthode générée par Matisse
    Par Babaôrom dans le forum NetBeans
    Réponses: 2
    Dernier message: 21/11/2006, 09h13

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