Symfony更新NumberType表单字段时,分单位金额转元显示报错如何解决
你遇到的报错是因为直接对form.starting_price执行除法运算,它是Symfony的表单字段实例对象,不是数据库存储的整数值,直接运算会触发非数值类型错误。
方案1:表单类添加数据转换器(最优)
这是最规范的实现方式,一次性搞定「展示时分转元」「提交时元转分」两个逻辑,无需在模板、控制器做额外处理。
首先修改你的表单类:
- 引入数据转换器接口
- 给
starting_price字段挂载转换器 - 可选配置
scale参数支持两位小数输入
完整代码示例:
use Symfony\Component\Form\DataTransformerInterface; // ... 其他原有代码 $builder ->add('starting_price', NumberType::class,[ 'label' => 'Starting price', 'scale' => 2, // 支持输入两位小数的金额 ]); // 给金额字段添加单位转换器 $builder->get('starting_price') ->addModelTransformer(new class implements DataTransformerInterface { // 数据库存储值(分)转表单展示值(元) public function transform($value): float|int|null { if (null === $value) { return null; } return $value / 100; } // 表单提交值(元)转数据库存储值(分) public function reverseTransform($value): int|null { if (null === $value) { return null; } return (int)round($value * 100); } });
修改完成后Twig代码无需改动,直接用原有{{ form_row(form.starting_price) }}即可正常展示为元单位,提交时自动转换为分存入数据库。
方案2:Twig端手动修改展示值(不推荐)
如果仅需要临时调整展示逻辑,不想改动表单类,可以单独渲染字段并手动赋值,注意要先取字段的真实数值:
{{ form_label(form.starting_price) }} {{ form_widget(form.starting_price, { 'value': form.starting_price.vars.value|default(0) / 100 }) }} {{ form_errors(form.starting_price) }}
⚠️ 注意:该方案仅修改展示逻辑,表单提交后你需要在控制器手动将拿到的元单位数值乘以100转为分,再存入数据库,否则会出现数据错误。
内容的提问来源于stack exchange,提问作者dwight
相关产品推荐
相关产品推荐

