gpt4 book ai didi

交响乐2 : how to override repository of another bundle

转载 作者:行者123 更新时间:2023-12-02 17:57:11 25 4
gpt4 key购买 nike

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

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

首先,在 OurVendorOverrideBundle.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();
}
}

如果我没有在 OverrideBundle 中设置实体,则会出现此错误:

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.

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

所以我在 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();
}
}

但是我遇到了这个错误:

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

它成功了。

...但是当我重新安装 bundle 时,为了测试一切是否正常,我遇到了这个 fatal error ,指出source_response已经定义(确实如此) .

那么我能做什么呢?

我还读到,除非源扩展 MappedSuperclass,否则我无法覆盖实体,在我的情况下,它不会。

但如果我只想覆盖它的存储库,我就注定失败了?是否可以 ?如果是这样,正确的方法是什么?

如果我完全删除覆盖实体的注释,我有:

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 }

关于交响乐2 : how to override repository of another bundle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34250665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com