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

Symfony PHP Discussion :

Surcharger les répository d'un autre bundle


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 125
    Par défaut Surcharger les répository d'un autre bundle
    Bonjour

    j'ai 2 bundles et je veux surcharger un repository de l'un dans l'autre :

    Mon bundle source : SourceBundle. mon bundle de surcharge : OverrideBundle

    D'abord, dans OurVendorOverrideBundle.php, j'ai ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function getParent()
    {
        return 'SourcevendorSourceBundle';
    }
    Puis

    Je souhaite ajouter une méthode perso dans le répository d'une entité du bundle source. L'entité source est Response.php, et son repository est ResponseRepository.php

    Donc j'ai fait :

    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
    <?php
    namespace OurVendor\OverrideBundle\Repository;
    use Doctrine\ORM\EntityRepository;
    use SomeVendor\SourceBundle\Repository\ResponseRepository as BaseRepository;
     
    class ResponseRepository extends BaseRepository
    {
        /**
         *
         * @return array
         */
        public function getQueryExerciseAllResponsesForAllUsers($exoId)
        {
            $qb = $this->createQueryBuilder('r');
            $qb->join('r.paper', 'p')
                ->join('p.exercise', 'e')
                ->where('e.id = ?1')
                ->andWhere('p.interupt =  ?2')
                ->setParameters(array(1 => $exoId, 2 => 0));
            return $qb->getQuery();
        }
    }
    Remarque : si je crée juste le répository dans OverrideBundle, ( = si je ne remets pas l'entité source dans OverrideBundle) j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The autoloader expected class "CPASimUSante\ExoverrideBundle\Entity\Response" to be defined in file "/home/www/myproject/vendor/ourvendor/override-bundle/OurVendor/OverrideBundle/Entity/Response.php". The file was found but the class was not in it, the class name or namespace probably has a typo.
    Mon entité source est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    namespace SomeVendor\SourceBundle\Entity;
    use Doctrine\ORM\Mapping as ORM;
    /**
     * SomeVendor\SourceBundle\Entity\Response
     *
     * @ORM\Entity(repositoryClass="SomeVendor\SourceBundle\Repository\ResponseRepository")
     * @ORM\Table(name="source_response")
     */
    class Response
    {
      ... les méthodes de source
    }
    Donc dans l'entité OverrideBudle j'ai mis :

    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
    <?php
    namespace OurVendor\OverrideBundle\Entity;
    use Doctrine\ORM\Mapping as ORM;
    use SomeVendor\SourceBundle\Entity\Response as BaseEntity;
    /**
     * SomeVendor\SourceBundle\Entity\Response
     *
     * @ORM\Entity(repositoryClass="OurVendor\OverrideBundle\Repository\ResponseRepository")
     * @ORM\Table(name="override_response")
     */
    class Response extends BaseEntity
    {
        public function __construct()
        {
            parent::__construct();
        }
    }
    Mais alors j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    An exception occurred while executing 'SELECT u0_.id AS id0, u0_.ip AS ip1, u0_.mark AS mark2, u0_.nb_tries AS nb_tries3, u0_.response AS response4, u0_.paper_id AS paper_id5, u0_.interaction_id AS interaction_id6 FROM ujm_exoverride_response u1_ INNER JOIN ujm_paper u2_ ON u0_.paper_id = u2_.id INNER JOIN ujm_exercise u3_ ON u2_.exercise_id = u3_.id WHERE u3_.id = ? AND u2_.interupt = ?' with params ["1", 0]:
     
    SQLSTATE[42S22]: Column not found: 1054 Unknown column 'u0_.id' in 'field list'
    Ceci semble indiquer que les champs/attributs de l'entité source ne sont pas trouvés. Donc j'ai changé

    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
    <?php
    namespace OurVendor\OverrideBundle\Entity;
    use Doctrine\ORM\Mapping as ORM;
    use SomeVendor\SourceBundle\Entity\Response as BaseEntity;
    /**
     * SomeVendor\SourceBundle\Entity\Response
     *
     * @ORM\Entity(repositoryClass="OurVendor\OverrideBundle\Repository\ResponseRepository")
     * @ORM\Table(name="source_response")
     */
    class Response extends BaseEntity
    {
        public function __construct()
        {
            parent::__construct();
        }
    }
    Et ça passe : pas d'erreur...

    ...mais si je réinstalle le bundle (ou fait un doctrine:schema:update), j'ai une erreur fatale indiquant que la table est déjà définie (ce qui est le cas).

    Que puis-je faire alors ?
    J'ai aussi lu qu'on ne peut surcharger une entité d'une autre bundle que si cette entité extends MappedSuperclass, ce qui n'est pas mon cas.

    Est-ce que ça a une incidence pour surcharger un repo ou n'est-ce pas relié ?
    Est-ce possible donc de surcharger un répository d'une autre entité, sans devoir recréer l'entité ?

    merci d'avance

    je n'ai rien trouvé dans la doc officielle sur le sujet des repository.

  2. #2
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2013
    Messages : 71
    Par défaut
    Bonjour,

    Si ce n'est pas trop indiscret, peux-tu nous dire ce qui t'as amené à devoir surcharger un repository d'un bundle depuis un autre bundle ?

    Il n'y a pas de véritables règles définissant le périmètre d'un bundle mais les bonnes pratiques précisent que :
    ... a bundle is meant to be something that can be reused as a stand-alone piece of software.

Discussions similaires

  1. [2.x] Surcharger une fonction Twig dans un autre bundle
    Par kokoro62 dans le forum Symfony
    Réponses: 0
    Dernier message: 12/06/2012, 16h06
  2. Récupérer les variables d'une autre fenêtre
    Par chuky dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 20/05/2012, 20h24
  3. Récuperer les fichiers d'une autre machine sur une autre
    Par khalidlyon dans le forum Réseau
    Réponses: 1
    Dernier message: 09/11/2004, 13h40
  4. Comment donner les droits sysdba à un autre user ?
    Par willone dans le forum Débuter
    Réponses: 3
    Dernier message: 24/09/2004, 11h15
  5. Réponses: 3
    Dernier message: 26/04/2004, 12h51

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