在持久化到实体之前转换从表单收集的数据

Posted

技术标签:

【中文标题】在持久化到实体之前转换从表单收集的数据【英文标题】:Transforming data collected from form before persisting to entity 【发布时间】:2015-06-07 18:25:31 【问题描述】:

我是 Symfony2 的新手,我只是通过一些现有的代码库来破解我的方式。我需要帮助来了解如何实现以下结果。

我有一个 PriceList 实体,它存储:

DollarCostPrice, PercentDiscount1, PercentDiscount2, PercentCommission

我希望用户通过表单输入以下 4 个值:

SalePrice, DollarDiscount1Price, DollarDiscount2Price, PercentCommission

在哪里,

SalePrice = (DollarCostPrice + (PercentCommission * DollarCostPrice))

DollarDiscount1Price = ((DollarCostPrice + (PercentCommission * DollarCostPrice)) * (100 - PercentDiscount1)/100)

DollarDiscount2Price = ((DollarCostPrice + (PercentCommission * DollarCostPrice)) * (1 - PercentDiscount2)/100)

但是一旦用户输入了上述值,我将计算需要在实体中持久化的DollarCostPrice, PercentDiscount1, PercentDiscount2, PercentCommission

我想在一个表单中使用上述 4 个字段的集合,以便用户可以一次为多个项目输入此信息。

我对在 Symfony2 中使用表单、集合和数据转换器还是个新手。如果有人能帮助我确定最好的方法,我将不胜感激。

【问题讨论】:

How to Use Data Transformers开始,这将回答你的问题 在发帖之前,我实际上浏览了该文档。那里的例子太简单了,我无法理解如何将集合的概念整合到表单中,以及如何将数据转换应用于多个值。 【参考方案1】:

我会这样做。请注意,我在这里做出假设,例如,您没有提供任何关于哪些实体与 PriceList 相关的信息。

    创建一个 PriceListType 表单类型,您将拥有 1 个映射字段 (PercentCommission) 和 3 个非映射字段(SalePrice、DollarDiscount1Price、DollarDiscount2Price)

添加非映射字段:

->add('SalePrice', null, array('mapped' => false))

我假设 PriceList 与某种 SKU 对象或类似对象有关。您需要考虑如何管理这种关系。

    从您的 PriceList 类型的基本表单开始。我会使用类似于 this technique 的内容来添加新的 PriceList 项目。

在保存时,我最初只是在控制器中进行实体计算以使事情快速启动并运行,例如

    $yourForm->handleRequest($request);
    if ($yourForm->isValid()) 

        // loop through elements in your collection - note for non mapped fields
        // you need to access them like so: $form->get("DollarDiscount1Price")->getData();

        // calculate the data you wish to save to each PriceList entity, set and persist it

        $entityManager->persist($priceListEntity);

        // finish & finally flush
        $entityManager->flush();
    

然后我可能会将该功能移至表单事件侦听器。

我自己认为这里不需要数据转换器,因为它会增加复杂性。如果您打算以多种形式重复使用此功能,那么我认为我不会担心。

人们会告诉你 X 是理想的解决方案,但 IMO 从简单开始,然后不断完善。

【讨论】:

以上是关于在持久化到实体之前转换从表单收集的数据的主要内容,如果未能解决你的问题,请参考以下文章

在持久化实体之前检查是不是违反约束

Symfony2/Doctrine:如何从实体类中持久化一个实体?

从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值

在提交之前不会通过查询检索持久化实体

持久化实体

jdbc向sqlserver插入数据时报错,SQLServerException: 不支持从 UNKNOWN 到 UNKNOWN 的转换