Symfony 2:如何覆盖另一个捆绑包的存储库

Symfony 2:如何覆盖另一个捆绑包的存储库,symfony,repository,overriding,Symfony,Repository,Overriding,我有2个bundle,我想覆盖其中一个bundle在另一个bundle中的存储库: 我有一个源包:SourceBundle。 我有我的覆盖包:覆盖包 首先,在我们的vendoroverridebundle.php中,我添加了: public function getParent() { return 'SomeVendorSourceBundle'; } 然后 我想为SourceBundle实体的存储库添加一个自定义方法。 源实体是Response.php,其存储库是ResponseR

我有2个bundle,我想覆盖其中一个bundle在另一个bundle中的存储库:

我有一个源包:SourceBundle。 我有我的覆盖包:覆盖包

首先,在我们的vendoroverridebundle.php中,我添加了:

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

我想为SourceBundle实体的存储库添加一个自定义方法。 源实体是Response.php,其存储库是ResponseRepository.php

所以我做了:

<?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();
    }
}
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
{
  ... 
}
似乎找不到表中的字段。所以我换了

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

另一个捆绑包中的原则映射可以在实体类元数据加载时重写

事件监听器
<?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();
    }
}
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'
<?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();
    }
}
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
<?php

namespace Lol\RandomBundle\EventListener;

use Doctrine\ORM\Event\LoadClassMetadataEventArgs;

class ClassMetadataListener
{
    /**
     * Run when Doctrine ORM metadata is loaded.
     *
     * @param LoadClassMetadataEventArgs $eventArgs
     */
    public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
    {
        $classMetadata = $eventArgs->getClassMetadata();

        if ('AnotherLol\AnotherRandomBundle\Entity\Response' === $classMetadata->name) {
            // Do whatever you want...
            $classMetadata->customRepositoryClassName = 'ThirdLol\SomeBundle\Repository\NewResponseRepository';
        }
    }
}
services:
    lol.random.listener.class_metadata:
        class: Lol\RandomBundle\EventListener\ClassMetadataListener
        tags:
            -  { name: doctrine.event_listener, event: loadClassMetadata }