NelmioApiDocBundle根据输入注释生成额外参数

时间:2015-04-12 11:58:05

标签: symfony annotations jmsserializerbundle

在我的symfony2项目中,我安装了FOSRestBundle和NelmioApiDocBundle以创建api。

我的POST路由有一个奇怪的行为:当我添加注释属性"输入"时,Nelmio软件包除了我的表单字段外还会生成一个额外的参数。这个额外的参数是表单实体本身。

屏幕:

Api web interface of the post endpoint

我试图调试Nelmio解析我的路线注释的那一刻:

nelmio debug route annotation parsing

我们可以注意到parameters属性已设置。

以下是我的帖子操作方法的注释:

/**
 * Create a Punchline from the submitted data.
 *
 * @ApiDoc(
 *   description = "Creates a new punchline from the submitted data.",
 *   input = {
 *      "class" = "Punchline\BackendBundle\Form\Type\PunchlineType",
 *      "options" = {"method" = "POST"}
 *   },
 *   statusCodes = {
 *     201 = "Returned when successful",
 *     400 = "Returned when the form has errors"
 *   }
 * )
 *
 * @param Request $request the request object
 *
 * @return Response
 */
public function postPunchlineAction(Request $request)

这是我的FormType:

<?php

namespace Punchline\BackendBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class PunchlineType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('content', 'text')
            ->add('author', 'author_selector')
            ->add('single', 'single_selector')
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Punchline\BackendBundle\Entity\Punchline'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'punchline';
    }
}

来自NelmioApiDocBundle documentation

  

如果设置输入,则捆绑包会自动提取参数   基于给定类型,并为每个参数确定其数据   类型,如果需要或不需要。

我尝试删除表单字段,参数窗口仍然存在...我没有找到设置此必需参数的位置。

2 个答案:

答案 0 :(得分:3)

从您发布的文档:

  

表单类型功能

     

即使您使用FormFactoryInterface :: createNamed('','your_form_type'),文档也会生成表单类型名称作为输入的前缀(your_form_type [param] ...而不仅仅是param)。

     

您可以在输入部分指定要与名称键一起使用的前缀:

     

input = {“class”=“your_form_type”,“name”=“”}

尝试像这样修改@ApiDoc:

 * @ApiDoc(
 *   description = "Creates a new punchline from the submitted data.",
 *   input = {
 *      "class" = "Punchline\BackendBundle\Form\Type\PunchlineType",
 *      "options" = {"method" = "POST"},
 *      "name" = ""
 *   },
 *   statusCodes = {
 *     201 = "Returned when successful",
 *     400 = "Returned when the form has errors"
 *   }
 * )

答案 1 :(得分:-2)

不要将FormType作为输入,而是将Type填充的Entity类。如果你考虑一下,你的API消费者不必知道如何处理数据,他们只关心他们提供的抽象实体。