Symfony 2: como substituir o repositório de outro pacote

Eu tenho 2 pacotes e quero substituir o repositório de um deles no outro:

Eu tenho um pacote de origem: SourceBundle. Eu tenho meu pacote de substituição: OverrideBundle

Primeiro, em OurVendorOverrideBundle.php, adicionei:

public function getParent()
{
    return 'SomeVendorSourceBundle';
}

Então

Eu queria adicionar um método personalizado para o repositório de uma entidade do SourceBundle. A entidade de origem é Response.php e seu repositório é ResponseRepository.php

Então eu fiz :

<?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();
    }
}

Se eu não definir a entidade no OverrideBundle, tenho este erro:

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.

A entidade SourceBundle é:

<?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
{
  ... 
}

Então, eu adiciono a Entity no OverrideBudle:

<?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();
    }
}

Mas então eu tenho esse erro:

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'

Parece que os campos na tabela não foram encontrados. Então eu mudei para

<?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();
    }
}

E funcionou.

... Mas quando reinstalei o pacote, para testar se estava tudo bem, eu tinha esseerro fatal declarando issosource_response já está definido (que é, de fato).

Então, o que posso fazer então?

Também li que não posso substituir uma entidade a menos que a fonte estenda MappedSuperclass, no meu caso, não.

Mas estou condenado se eu quiser apenas substituir seu repositório? É possível ? Se sim, qual é o caminho certo?

Se eu remover completamente a anotação da entidade de substituição, tenho:

Class "OurVendor\OverrideBundle\Entity\Response" sub class of "SomeVendor\SourceBundle\Entity\Response" is not a valid entity or mapped super class.
500 Internal Server Error - MappingException

questionAnswers(1)

yourAnswerToTheQuestion