在我的symfony2项目中,我安装了FOSRestBundle和NelmioApiDocBundle以创建api。
我的POST路由有一个奇怪的行为:当我添加注释属性"输入"时,Nelmio软件包除了我的表单字段外还会生成一个额外的参数。这个额外的参数是表单实体本身。
屏幕:
我试图调试Nelmio解析我的路线注释的那一刻:
我们可以注意到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:
如果设置输入,则捆绑包会自动提取参数 基于给定类型,并为每个参数确定其数据 类型,如果需要或不需要。
我尝试删除表单字段,参数窗口仍然存在...我没有找到设置此必需参数的位置。
答案 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消费者不必知道如何处理数据,他们只关心他们提供的抽象实体。