在持久化到实体之前转换从表单收集的数据
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 的转换