首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NelmioApiDocBundle根据输入注释生成额外的参数。

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

Stack Overflow用户
提问于 2015-04-12 11:58:04
回答 2查看 3.3K关注 0票数 4

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

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

屏幕:

我试着调试Nelmio解析我的路由注释的那一刻:

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

下面是我的post操作方法的注释:

代码语言:javascript
复制
/**
 * 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:

代码语言:javascript
复制
<?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文档

如果设置了输入,则包将根据给定类型自动提取参数,并为每个参数确定其数据类型,以及是否需要数据类型。

我试着移除表单字段和参数残存.我没有找到设置所需参数的位置。

EN

回答 2

Stack Overflow用户

发布于 2015-04-16 06:35:44

从你贴出的文件来看:

表格类型特征 即使您使用FormFactoryInterface::createNamed(‘,'your_form_type'),文档也将生成表单类型名称作为输入的前缀(your_form_typeparam .而不是仅仅是param)。 可以在输入部分的名称键中指定要使用的前缀: input ={ "class“= "your_form_type","name”= "“}

尝试像这样修改@ApiDoc:

代码语言:javascript
复制
 * @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"
 *   }
 * )
票数 3
EN

Stack Overflow用户

发布于 2015-04-12 12:53:57

不要将FormType作为输入,而是将类型填充的实体类。如果您仔细想想,您的API使用者不必知道数据是如何处理的,他们只关心他们提供的抽象实体。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29589180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档