danaizulai/eav-model-bundle

实体-属性-值模型的Symfony & Doctrine实现,易于扩展

dev-main 2024-01-16 10:23 UTC

This package is auto-updated.

Last update: 2024-09-24 14:11:17 UTC


README

SensioLabsInsight

本文档的规范版本可在此处找到: https://vincentchalnot.github.io/SidusEAVModelBundle

简介

此捆绑包允许您使用Doctrine在Symfony项目中快速设置动态模型。
模型配置使用Yaml完成,一切都可以轻松扩展。

据我所知,该模型的主要特性是能够根据您需要的**尽可能多的上下文化轴**对数据进行上下文化。

所有EAV模型都允许您根据语言或国家(是的:国际化是数据上下文化的一个子集)对数据进行上下文化,某些模型允许您根据某些渠道或范围对数据进行上下文化,但这个特定的实现允许您根据业务逻辑管理上下文化轴,而不是相反。

主要功能

文档索引

其他文档条目

寻找某些内容?

查看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,并鼓励您这样做。