danaizulai / eav-model-bundle
实体-属性-值模型的Symfony & Doctrine实现,易于扩展
Requires
- php: >=7.4
- ext-mbstring: *
- doctrine/doctrine-bundle: ^1.6
- doctrine/orm: ^2.5
- sidus/base-bundle: ~1.0
- symfony/symfony: ^4.0
Suggests
- sidus/eav-bootstrap-bundle: Easy Twitter Bootstrap integration
This package is auto-updated.
Last update: 2024-09-24 14:11:17 UTC
README
本文档的规范版本可在此处找到: https://vincentchalnot.github.io/SidusEAVModelBundle
简介
此捆绑包允许您使用Doctrine在Symfony项目中快速设置动态模型。
模型配置使用Yaml完成,一切都可以轻松扩展。
据我所知,该模型的主要特性是能够根据您需要的**尽可能多的上下文化轴**对数据进行上下文化。
所有EAV模型都允许您根据语言或国家(是的:国际化是数据上下文化的一个子集)对数据进行上下文化,某些模型允许您根据某些渠道或范围对数据进行上下文化,但这个特定的实现允许您根据业务逻辑管理上下文化轴,而不是相反。
主要功能
- 模型定义在Yaml配置文件中,简单、强大且可版本控制。
- 动态表单:无需再编写表单类型
- 使用自定义上下文轴(语言、区域、渠道、版本等)进行数据上下文化
- 与许多原生Symfony组件兼容:表单、验证器、翻译器、序列化器等
文档索引
- 01 - 安装
- 02 - 模型配置
- 03 - 多属性 & 集合
- 04 - 处理实体
- 05 - 表单
- 06 - 验证
- 07 - 查询
- 08 - 模型翻译
- 09 - EAV上下文化
- 10 - 序列化
- 11 - 扩展 & 自定义模型
- 12 - 自定义类
- 13 - 事件
- 14 - 扩展
其他文档条目
寻找某些内容?
查看Q&A部分并在问题中提出问题。
什么是EAV模型
EAV代表实体-属性-值
主要特点是在与实体不同的表中存储值。请参阅维基百科文章中的混乱和不太准确的内容。
此实现实际上是更E(A)V模型而不是传统EAV模型,因为属性不是存储在数据库中而是在Yaml文件中。
如果您不熟悉EAV模型的关键概念,请阅读以下内容。
为什么使用它
- 允许快速模型设计,因为它超级容易启动。
- 将模型和元数据(如:表单配置、验证、序列化选项等)放在同一位置。
- 以相同的方式管理单值属性和多值属性,并且可以在不进行数据恢复的情况下更改主意。
- 按:地区、国家、渠道(网络/打印/移动)、版本存储上下文值。
- 分组和排序属性。
- 简单的CRUD:您的表单已经配置好了!
为什么不使用它呢?
性能?这不是一个真正的问题,因为无论如何MySQL都不适用于在大量数据中进行搜索,无论是EAV模型还是更标准的关联模型。解决方案:Elastic Search:目前通过Sidus/FilterBundle以及Sidus/ElasticaFilterBundle可选支持。
关联模型
如果您有一个复杂的关联模型并且计划使用许多连接来检索数据,最好将您的关联模型保留在EAV模型之外,但两者可以共存而没有任何问题。然而,在实施此EAV模型时存在技术限制:只有一个数据条目表和一个值表。
实施
我们使用Doctrine,因为它是最受Symfony社区支持的ORM,并且我们只针对MySQL/MariaDB数据存储进行实施。
在任何EAV模型中都有两个方面
- 模型本身:家族(数据类型)、属性和属性类型。
- 数据:值和包含值的类,在这里称为“数据”。
在某些实现中,模型存储在数据库中,但我们选择出于几个原因在Symfony服务配置中维护模型。
- 出于性能原因,您始终需要从模型访问大量组件,而延迟加载将生成许多不必要的SQL请求。与任何其他存储系统相比,Symfony服务是从PHP缓存系统中延迟加载的,这是非常非常快的。
- 出于复杂性原因:使用服务,您始终可以定义新的服务、使用注入、扩展现有服务并为实体具有复杂的行为。
- Symfony配置易于编写和维护,可以进行版本控制,当您的模型与您的数据一起存储在数据库中时,您将很难在不同环境中维护相同的模型。
- 因为最终用户永远不会直接在生产中编辑模型,它总是某些专家或某些开发人员在测试环境中首先进行编辑,我们更喜欢简单的yaml配置文件而不是可能失败的复杂管理系统。
- 它允许您为特殊需求添加配置层,例如您可以直接在属性声明中配置一些表单选项。
- 最后,如果需要,您可以将配置拆分并组织到不同的文件中,并且可以对其进行注释,这在您的模型开始变得越来越大,有数百个不同的属性时是一个强大的功能。
家族和属性是自动从您的配置中生成的服务,属性类型是标准的Symfony服务。
示例
对于基本的博客,配置将如下所示
sidus_eav_model: families: Post: attributeAsLabel: title attributes: title: # Default type is string required: true content: type: html # This type is available through the EAVBootstrapBundle publicationDate: type: datetime publicationStatus: type: choice form_options: # Symfony form options are passed directly choices: draft: Draft published: Published archived: Archived author: type: data_selector # This type allows to select an other entity inside the EAV model options: autoload: true # Autoload author when loading Post allowed_families: - Author tags: multiple: true form_options: collection_options: sortable: true isFeatured: type: boolean Author: attributeAsLabel: name attributes: name: required: true email: validation_rules: # Validation rules can be applied directly in the model - Email: ~
请注意,按照惯例,我们声明家族为UpperCamelCase,属性为lowerCamelCase,并鼓励您这样做。