Php 删除Zend\Form\Collection的所有元素(带有DoctrineModule ObjectSelect的字段集)

Php 删除Zend\Form\Collection的所有元素(带有DoctrineModule ObjectSelect的字段集),php,doctrine-orm,zend-framework2,zend-form2,Php,Doctrine Orm,Zend Framework2,Zend Form2,我正在开发一个ZF2应用程序,它使用ZF2表单和DoctrineModule,或者在一个简单的CRUD系统中创建/更新实体。该实体(联盟)与另一实体(团队)有一个单一的关联,该关联由表单站点上的Zend\Form\Element\Collection表示。使用表单创建新实体或更新现有实体时,一切正常,但有一种情况除外:清空预先存在的实体的关联集合。当我删除集合的所有元素并单击“保存”时,表单将被反弹回来,集合的每个现有元素都显示错误值是必需的,不能为空 显示问题的视频: 代码: 控制器: 服务

我正在开发一个ZF2应用程序,它使用ZF2表单和DoctrineModule,或者在一个简单的CRUD系统中创建/更新实体。该实体(联盟)与另一实体(团队)有一个单一的关联,该关联由表单站点上的
Zend\Form\Element\Collection
表示。使用表单创建新实体或更新现有实体时,一切正常,但有一种情况除外:清空预先存在的实体的关联集合。当我删除集合的所有元素并单击“保存”时,表单将被反弹回来,集合的每个现有元素都显示错误
值是必需的,不能为空

显示问题的视频:

代码:

  • 控制器:
  • 服务:
  • 表格:
  • 字段集:
    • 联合字段集:
    • 联合\团队字段集:
  • 实体:
    • 工会:
    • 小组:
问题似乎归结为InputFilter,但我似乎无法确定到底是什么地方出了问题。删除集合的N个条目中的(N-1)项效果很好,所以InputFilter结构本身没有问题。可能当发布的集合为空时,
Zend\Form
不会删除分配给
teams
集合的每个元素的现有NotEmpty验证器

为Union字段集提供了自定义输入筛选器(),但是
teams
集合元素没有列出输入。我还尝试过完全删除自定义InputFilter,并为
团队
集合添加合适的InputFilter定义,但最终结果是相同的


有人知道我做错了什么吗

尝试让您的
TeamFieldset
实现
Zend\InputFilter\InputFilterProviderInterface
,然后将以下方法添加到该字段集:

public function getInputFilterSpecification()
{
    return array(
        'id' => array(
            'required' => false,
        )
    );
}

修改了
TeamFieldset

为了解决这个问题,我更新了接收表单POST的控制器,以检测何时从客户端清空了集合,并手动清空实体上的集合:

if ( !isset($data['union']['teams']) || empty($data['union']['teams']) ) {
    $entity->removeTeams($entity->getTeams());
}

这给了我一个稍微不同的结果。集合元素不再具有与它们相关联的错误,因此表单将进行验证,但实体仍然会在原始集合元素完好无损的情况下从另一侧弹出。在某种程度上,POST请求不包含
团队
集合的痕迹这一事实导致表单“忘记”调用实体上的
removeTeams来清除集合。这真是奇怪的情况。似乎github上的问题和/或与此相关。