【问题标题】:Doctrine2 bug imports 'private' variables from MappedSuperClass when generating entities生成实体时,Doctrine2 错误从 MappedSuperClass 导入“私有”变量
【发布时间】:2014-04-17 22:36:41
【问题描述】:

我正在使用 Symfony 的实体类和 Doctrine 的 ORM 注释来将值持久保存到数据库中。大多数表都需要一些标准字段,因此我创建了一个所有其他实体都可以扩展的基本实体。根据文档,这称为 MappedSuperClass:http://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html

// src/Acme/Bundle/Entity/Base.php
namespace Acme\Bundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\MappedSuperclass
 * @ORM\HasLifecycleCallbacks()
*/
class Base {

    /**
    * @ORM\Column(type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    protected $id;

    // more values...

}

然后我创建多个扩展此基础的实体:

// src/Acme/Bundle/Entity/View.php
namespace Acme\Bundle\Entity;
use Doctrine\ORM\Mapping as ORM;

View extends Entity\Base
{
     // entity definitions
}

这是为实体设置默认定义的最佳方式吗?如果您有更好的建议,请告诉我。

接下来,当我通过以下方式生成实体时: php 应用程序/控制台原则:generate:entities Acme\Bundle

第一次创建 getter 和 setter 时效果很好,但是如果我对实体进行更改并再次生成,则会出现如下错误:

Fatal error: Access level to Acme\Bundle\Entity\View::$id must be protected (as in class Acme\Bundle\Entity\Base) or weaker in /src/Acme/Bundle/Entity/View.php

这是因为doctrine:generate:entities 正在将 MappedSuperClass 中的“受保护”变量作为“私有”导入扩展实体。

其他人在没有解决方案的情况下抱怨此错误: FOSUserBundle generate:entities does not work, Access level of fields too high https://github.com/FriendsOfSymfony/FOSUserBundle/issues/102

问题:学说应该导入受保护的变量吗?是否应该将它们设置为“私有”?或者这只是一个已知的 Symfony 错误?

似乎它不应该导入受保护的变量,因为 @ORM 定义已经在 MappedSuperClass 中并且没有导入(当我删除导入的私有变量时它工作正常)。但如果它确实导入它们,它不应该将它们设置为私有......

我确实必须通过我的所有实体进行搜索和替换才能删除它们。每一个。单身的。时间。

这里建议的行动方案是什么?如果这是一个错误,是否有人报告了这个问题?修复的时间表是什么?怎么在github上搜索这个问题,如果没有上报呢?

问题 2:只要存在这个错误,有没有办法只在单个实体上生成 getter/setter? 例如php app/console doctrine:generate:entities Acme\Bundle\Entity\View(这当然行不通)。如果我一次只能生成一个实体,那么删除我所有实体中所有导入的私有变量就不会那么麻烦了。 [编辑:我在下面回答了这个问题]

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    #2 的答案是,是的,您可以只为一个实体生成实体 getter/setter。

    如果您在命令行中键入:

    php app/console doctrine:generate:entities --help
    

    你会得到一个选项列表。在那里,您将看到如何将实体限制为捆绑、捆绑中的单个实体或整个命名空间:

    You have to limit generation of entities:
    * To a bundle: 
    php app/console doctrine:generate:entities MyCustomBundle
    
    * To a single entity:
    php app/console doctrine:generate:entities MyCustomBundle:User
    php app/console doctrine:generate:entities MyCustomBundle/Entity/User
    
    * To a namespace
    php app/console doctrine:generate:entities MyCustomBundle/Entity
    

    【讨论】:

      【解决方案2】:

      对于问题1,继承实体时需要重新定义每个主键。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多