gpt4 book ai didi

doctrine-orm - Symfony2 Doctrine 未找到不同 bundle 的映射父类(super class)注释

转载 作者:行者123 更新时间:2023-12-04 05:24:51 25 4
gpt4 key购买 nike

Symfony 2.8 + Doctrine

我有两个 bundle :CoreBundleBonusBundle

CoreBundle有包含抽象类的文件夹模型 ClassA :

use Doctrine\ORM\Mapping as ORM;
//[...]

abstract class ClassA
{

/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
protected $name;
}

在另一个目录实体 - ClassB :

//[...]
/**
* ClassB
*
* @ORM\Table()
* @ORM\Entity
*/
class ClassB extends ClassA
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

}

目前运行良好,ClassB继承name属性,这样我们就映射了实体 ClassBidname .

我在BonusBundle的模型目录中添加了(第二个)其他抽象类ClassC 。它与 ClassA 相同,但在其他 bundle 中。

现在我的示例的最后一个关键点 - 我添加了 ClassDCoreBundle (实体目录)从 BonusBundle 扩展 ClassC (与上面的方法相同)。

我的问题

结果我收到了具有属性 id 的 ClassB , name和 ClassD 仅具有 id属性。

我不明白为什么会发生这种情况。如果父类(super class)存在于其他 bundle 中,它看起来像 Doctrine 会忽略注释。我检查了一些文档和其他问题,但我无法理解发生了什么。 I see in config docs hereauto_mapping选项检查实体目录:

Doctrine's auto_mapping feature loads annotation configuration from the Entity/ directory of each bundle and looks for other formats (e.g. YAML, XML) in the Resources/config/doctrine directory.

If it wasn't possible to determine a configuration format for a bundle, the DoctrineBundle will check if there is an Entity folder in the bundle's root directory. If the folder exist, Doctrine will fall back to using an annotation driver.

在我的项目中,此文件夹同时存在于 Bundles 中。如果 symfony 仅检查实体文件夹,那么为什么第一个示例(模型)运行良好?这个机制如何运作?

最佳答案

我测试了一些可能性,并找到了修复它的解决方案,但仍然不知道为什么会发生这种情况。

如果我向父类(super class)添加注释 @ORM\MappedSuperclass()那么映射就会正确加载,但前提是类位于 Entity目录。

use Doctrine\ORM\Mapping as ORM;

/**
* ClassA
*
* @ORM\MappedSuperclass()
*/
abstract class ClassA
{
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
protected $name;
}

这样我的注释就可以在其他 Bundles 中看到和我的ClassA不是Entity本身。

我仍然不明白为什么如果类存在于同一个 Bundle 中但在其他目录中它会起作用。此外,FoSUserBundle 内部存在类似的示例,使用 MappedSuperclass() -FOSUserBundle/Model/User.php但它位于模型目录中并且仍在工作。


//编辑

完成@Boulzy 回答

可能我找到了第二部分的答案 - 为什么它可以看到来自其他目录但同一个包的映射。在分析其他工作示例后,我发现具有严格访问权限的映射属性 private对于子类不可见,但 protected属性是可见的、映射的并且不需要 @ORM\MappedSuperclass()注解只要用在同一个 Bundle 中即可.

看来@ORM\MappedSuperclass()让我们有可能绘制 map private属性,这样它们对于任何其他包中的其他类都是可见的和映射的(只要它位于实体或其他映射目录中)。

关于doctrine-orm - Symfony2 Doctrine 未找到不同 bundle 的映射父类(super class)注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40470485/

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