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é :
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 :
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 :
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 :
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 :
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 :
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é
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.
Partager