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.