REST API:如何使用fosrestbundle

时间:2018-02-21 15:11:10

标签: json symfony many-to-many symfony-forms fosrestbundle

在我的Symfony 4项目中,我有2个实体:Question和PossibleAnswer。
一个问题可以有很多可能的答案,答案可以用在许多不同的问题中。

我想发帖提问,我使用FOSRestBundle
这就是我格式化请求的主体:

{
    "title": "my question",
    "possibleAnswers": [
        {
            "id": 1,
            "title": "my first answer"
        }
    ]
}

至少这是FOSRestBundle在我直接在数据库中创建数据并解决问题时如何格式化答案。

但我一直得到同样的错误:

  

验证失败,possibleAnswers此值无效

我使用Symfony表单来验证我的POST,而我用于Question的possibleAnswers字段的fieldType是一个EntityType,其中选项multiple设置为true。也许这就是错误的来源。

所以我的问题是:
如何格式化我的请求正文以添加有效的possibleAnswers字段?如果我正在做的话,我应该使用哪种表格类型来运作?

很抱歉没有添加任何代码,上下文实际上要复杂得多,但我非常确定我的字段的JSON格式或表单类型是错误的。

[编辑]

这里是我为possibleanswers字段尝试的所有表单类型

//->add('possibleAnswers', EntityType::class, array('data' => [], 'required' => false, 'multiple' => true, 'class' => PossibleAnswer::class))
  ->add('possibleAnswers', CollectionType::class, array('required' => false, 'entry_type' => EntityType::class, 'entry_options' => array('class' => PossibleAnswer::class)))
//->add('possibleAnswers', CollectionType::class, array('required' => false, 'entry_type' => PossibleAnswerType::class))
//->add('possibleAnswers', CollectionType::class, array('required' => false, 'entry_type' => PossibleAnswerType::class, 'entry_options' => array('class' => PossibleAnswer::class)))

这里是我尝试选择可能性的所有JSON格式:

{
    "title": "a postman created question",
    "answerConditions": [
        {
            "id": 1,
            "title": "already existing question",
        }
    ]
}

{
    "title": "a postman created question",
    "answerConditions": [
        {
            "possibleanswer_id": 1
        }
    ]
}

{
    "title": "a postman created question",
    "answerConditions": [
        {
            "id": 1
        }
    ]
}

{
    "title": "a postman created question",
    "answerConditions": [
        1
    ]
}

1 个答案:

答案 0 :(得分:3)

如果要在发布问题时创建PossibleAnswer,则需要在表单中用CollectionType替换EntityType。

我经常在我的POST请求中使用它,当我想发布父对象时发布子对象(这里是PossibleAnswer)(问题):

问题表格

$builder
    ->add('possibleAnswers', CollectionType::class, array(
        'entry_type'  => PossibleAnswerType::class,
        'allow_add' => true,
    ))
;

PossibleAnswer表格:

$builder
    ->add('title')
;

json看起来像:

{
    "title": "my question",
    "possibleAnswers": [
        {
            "title": "my first answer"
        }
    ]
}

希望它可以提供帮助。

编辑: 如果您想在创建问题时将PossibleAnswer链接到问题,可以使用:

问题表格:

$builder
    ->add('possibleAnswer', EntityType::class, array(
        'class' => YOUR_ENTITY::class,
        'multiple' => true
    ));

你的json应该只包含你要链接到的实体的id。它应该是这样的:

{
    "title": "a postman created question",
    "answerConditions": [
        1
    ]
}