You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony集合类型表单事件报错:不支持字符串+整数运算

Symfony Collection Type表单事件问题解决方案

第一个错误:$data->getData()为null导致调用方法失败

问题原因

在Collection Type的条目初始化时(比如新增空条目或渲染原型),FormEvents::PRE_SET_DATA事件中的$event->getData()可能为null,而非Mc实例,此时直接调用$data->getRegion()会触发错误。

修复代码

修改McType中的PRE_SET_DATA事件监听逻辑,使用提前判断得到的$region变量,而非直接调用$data->getRegion():

$builder->addEventListener(
    FormEvents::PRE_SET_DATA,
    function(FormEvent $event) use ($formModifier){
        $data = $event->getData();
        $region = null;

        if ($data instanceof Mc) {
            $region = $data->getRegion();
        }
        // 改用已赋值的$region变量,避免$data为null时调用方法
        $formModifier($event->getForm(), $region);
});

第二个错误:不支持的操作类型:字符串+整数

常见原因及修复方案

1. 关联方法名错误(最可能)

Region与Location是一对多关联,Region类的关联方法应为复数形式getLocations(),若写成单数getLocation()会返回单个对象而非集合,导致后续表单处理出错。

  • 检查Region.php中的关联方法:
// Region.php
use Doctrine\Common\Collections\Collection;

/**
 * @ORM\OneToMany(targetEntity=Location::class, mappedBy="region")
 */
private Collection $locations;

public function getLocations(): Collection
{
    return $this->locations;
}
  • 更新McType中的代码:
$formModifier = function(FormInterface $form, Region $region = null){
    // 调用getLocations()而非getLocation()
    $locations = null === $region ? [] : $region->getLocations();
    $form->add('location', EntityType::class, [
        'label' => 'Location',
        'class' => Location::class,
        'choices' => $locations
    ]);
};

2. Collection原型索引处理不当

前端渲染Collection原型时,需确保替换__name__的是整数索引,避免使用字符串索引导致Symfony内部运算错误。

示例Twig模板及JS处理:

{# 渲染已有条目 #}
{% for mc in form.mcs %}
    <div class="mc-item">{{ form_row(mc) }}</div>
{% endfor %}

{# 原型容器 #}
<div class="collection-prototype" data-prototype="{{ form_widget(form.mcs.vars.prototype)|e('html_attr') }}"></div>
// 添加新条目的JS逻辑
document.getElementById('add-mc-btn').addEventListener('click', function() {
    const container = document.getElementById('mcs-container');
    const index = container.querySelectorAll('.mc-item').length;
    const prototype = document.querySelector('.collection-prototype').dataset.prototype;
    // 使用整数替换__name__
    const newForm = prototype.replace(/__name__/g, index);
    container.insertAdjacentHTML('beforeend', newForm);
});

3. 实体关联映射验证

确保Mc类中region和location的关联映射及getter/setter正确:

// Mc.php
/**
 * @ORM\ManyToOne(targetEntity=Region::class)
 * @ORM\JoinColumn(nullable=true)
 */
private ?Region $region = null;

/**
 * @ORM\ManyToOne(targetEntity=Location::class)
 * @ORM\JoinColumn(nullable=true)
 */
private ?Location $location = null;

public function getRegion(): ?Region
{
    return $this->region;
}

public function setRegion(?Region $region): self
{
    $this->region = $region;
    return $this;
}

public function getLocation(): ?Location
{
    return $this->location;
}

public function setLocation(?Location $location): self
{
    $this->location = $location;
    return $this;
}

内容的提问来源于stack exchange,提问作者Demi God

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:15:39