Symfony Forms CollectionType,按 ID 索引

标签 symfony symfony-forms

我正在为 REST API 开发带有嵌入式类型的 Symfony 4 表单。形式:

class OffertaType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('pulsanti_social_attivi', CheckboxType::class, [ ])
            ->add('immagini', CollectionType::class, [
                'entry_type' => OffertaImmagineType::class,
                'allow_add' => true,
                'allow_delete' => true,
                'by_reference' => false,
                'prototype' => 'immagini'
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(
            [
                'data_class'         => Offerta::class,
                'allow_extra_fields' => true,
                'csrf_protection'    => false,
            ]
        );
    }
}

该集合包含 2 个对象

[
    {
        "id": 1,
        "url": "https://via.placeholder.com/150?text=1"
    },
    {
        "id": 2,
        "url": "https://via.placeholder.com/150?text=2"
    }
]

所有“有效”,如果我发布一些数据,则会创建一个新对象,如果我更新一个对象,则会更新数据库。奇怪的是行的更新/删除似乎是基于对象在集合中的位置而不是它的 ID。如果我删除第一个对象,结果应该是

[
    {
        "id": 2,
        "url": "https://via.placeholder.com/150?text=2"
    }
]

但是它

[
    {
        "id": 1,
        "url": "https://via.placeholder.com/150?text=2"
    }
]

Symfony 只看到 1 个对象,所以删除第二个并更新第一个“url”字段。

我如何根据对象的 ID 而不是它们的位置“索引”集合?

最佳答案

在 Symfony 的存储库中有一个打开的票证,用于向 CollectionType 添加一个功能来索引自定义字段上的项目:https://github.com/symfony/symfony/issues/7828这将解决您遇到的问题,但该票证仍未解决且尚未推进。

然而,在线程的更深处,人们通过手动更改实体的 ArrayCollection 以使用 id 对其进行索引来找到解决方法,如下所示:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $entity = $builder->getData();

    // Reindex collection using id
    $indexedCollection = new ArrayCollection();
    foreach ($entity->getCollectionField() as $collectionItem) {
        $indexedCollection->set($collectionItem->getId(), $collectionItem);
    }

    $builder
        ->add('collectionField', CollectionType::class, [
            'data' => $indexedCollection,
        ])
    ;
}

(从 Seb33300 的回答 https://github.com/symfony/symfony/issues/7828#issuecomment-579608260 复制)。

然后你可以发回这个JSON:

{
    "immagini": {
        "2": {"url": "http://new-url.com"}
    }
}

并且它将映射到集合中 ID 为 2 的实体。

关于Symfony Forms CollectionType,按 ID 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54292270/

相关文章:

validation - Symfony 表单验证约束表达式

Symfony2 - 表单集合原型(prototype)中的默认值

Symfony2.访问 Form 类中提交的值

php - Symfony Assets :dump runtime exception

php - 使用 Symfony2 重载 bundle

php - Symfony 如何转换表单中的数据值

validation - 如何覆盖 FOSUserBundle 的验证规则

php - 为 Symfony 选择字段中的每个选项添加不同的 HTML 属性

php - 替换/装饰 `translation.reader`

html - 在标签之前放置复选框/单选标签