Php Symfony 2中的可配置动态条令数据库实体 我正在努力实现的目标 用户可以通过网站上的HTML表单配置条令实体 用户将能够定义新实体,以及为现有实体添加和删除字段。(类似于) 条令实体将根据用户通过web UI提供的配置获得动态属性 当实体配置发生变化时,每个条令实体的单个DB表将动态地改变;或者,每个实体可以使用多个表(每个新实体字段都有自己的表) 迄今为止已完成
在过去的几天里,我一直在研究这个问题,但没有取得多大成功,但我偶然发现了一个似乎与我正在努力实现的目标非常相关的问题 我已经注册并添加了loadClassMetadata侦听器,该侦听器映射字段foo: 现在,只要我在DynamicMappingTest\AdminBundle\Entity\CustomNode类中声明了foo属性,这一切都可以工作: 问题 但是,我无法知道用户将为其自定义实体定义哪些属性。如果我从CustomNode类中删除foo属性,那么从ClassMetadata中获取的ReflectionClass自然不会包含foo属性,因此每当执行MappingListener中的mapField()时,我会得到以下异常:Php Symfony 2中的可配置动态条令数据库实体 我正在努力实现的目标 用户可以通过网站上的HTML表单配置条令实体 用户将能够定义新实体,以及为现有实体添加和删除字段。(类似于) 条令实体将根据用户通过web UI提供的配置获得动态属性 当实体配置发生变化时,每个条令实体的单个DB表将动态地改变;或者,每个实体可以使用多个表(每个新实体字段都有自己的表) 迄今为止已完成,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,在过去的几天里,我一直在研究这个问题,但没有取得多大成功,但我偶然发现了一个似乎与我正在努力实现的目标非常相关的问题 我已经注册并添加了loadClassMetadata侦听器,该侦听器映射字段foo: 现在,只要我在DynamicMappingTest\AdminBundle\Entity\CustomNode类中声明了foo属性,这一切都可以工作: 问题 但是,我无法知道用户将为其自定义实体定义哪些属性。如果我从CustomNode类中删除foo属性,那么从ClassMetadata中获取的
ReflectionException: Property DynamicMappingTest\AdminBundle\Entity\CustomNode::$foo does not exist
in vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php at line 80
问题
- 有可能拥有完全可配置的动态条令实体吗
- 我的方法正确吗?如果没有,你能提出一个替代方案吗
- 我怎样才能拥有真正的动态类属性?或者,我应该在用户更改实体配置时生成新的Doctrine实体PHP类吗
正如我提到的——是的。除非你想覆盖或替换一些条令代码,但我想可能会有很多(代理类等)你在这方面有什么进展吗?我也处于类似的困境中,可以使用任何见解:)@Alex.Barylski有一个类似的问题,也许它会帮助你:我已经开发了一些类似于你想要实现的东西。但我使用的是标准SQL。如果您最终也使用了标准SQL,那么您将始终需要选择/更新/任何使用标准SQL的动态实体。SalesForce实现了这个概念,尽管可能没有使用条令。它允许用户创建和关联自定义对象和字段。以及在基础对象数据点上创建报告、视图/表单和仪表板。然而,如上所述,ORM不会在后端用于为最终用户“生成”对象和关联。ORM将用于开发将其连接在一起的逻辑,以便向最终用户显示分配的关联;e、 g.
类用户对象::$fields
,类用户字段::$dataType
,等等。一个用例是让客户能够自己定义其产品类/类别。他可以定义类应该具有哪些属性,以及该属性可能具有哪些值。我开发了这样一个东西,但我使用标准sql。
// src/DynamicMappingTest/AdminBundle/Entity/CustomNode.php
namespace DynamicMappingTest\AdminBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* CustomNode
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="DynamicMappingTest\AdminBundle\Entity\CustomNodeRepository")
*/
class CustomNode
{
...
private $foo;
}
ReflectionException: Property DynamicMappingTest\AdminBundle\Entity\CustomNode::$foo does not exist
in vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php at line 80
77. */
78. public function getAccessibleProperty($class, $property)
79. {
80. $reflectionProperty = new ReflectionProperty($class, $property);
81.
82. if ($reflectionProperty->isPublic()) {
83. $reflectionProperty = new RuntimePublicReflectionProperty($class, $property);