我正在将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 app / console doctrine: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
似乎它不应该导入受保护的变量,因为@ORM定义已经在MappedSuperClass中并且没有导入(并且当我删除导入的私有变量时它工作正常)。但如果它确实导入它们,则不应将它们设置为私有...
我确实必须进行搜索并通过我的所有实体替换以删除这些。每一个。单。时间。
这里建议的行动方案是什么?如果这是一个错误,有人报告了这个和修复的时间表是什么?我应该如何在github上搜索这个问题并在没有报告的情况下报告?
问题2:只要存在此错误,是否有办法在单个实体上生成getter / setter?
例如php app/console doctrine:generate:entities Acme\Bundle\Entity\View
(当然这不起作用)。如果我一次只能生成一个实体,那么删除所有实体中所有导入的私有变量就不那么麻烦了。
[编辑:我在下面回答了这个问题]
答案 0 :(得分:0)
#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
答案 1 :(得分:0)
对于问题1,您需要在继承实体时重新定义每个主键。