【发布时间】: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