如何在Nelmio ApiDocBundle

时间:2015-10-19 19:10:53

标签: symfony symfony-2.7 nelmioapidocbundle

我使用input注释的@ApiDoc属性来指定我的api作为表单字段的参数。

 * @ApiDoc(
 *      section="User",
 *      resource=true,
 *      input={
 *          "class"="Nik\UserBundle\Form\UserType",
 *      },
 *     ....
表单的

data_class是对属性进行约束验证的实体。

我希望nelmio api doc将参数格式指定为实体的验证约束,但格式为空。

enter image description here

如何在nelmio ApiDocBundle中指定参数格式?

修改: 也许我写了一个糟糕的问题。

我们可以指定input&的解析器output,如果我们没有为这些指定解析器,它会调用input&的所有解析器。 output,然后为UserType调用所有解析器。

nelmio有一个名为ValidationParser的解析器,其名为parseConstraint的方法设置format用于输入&输出,但是我的文档没有调用此方法,为什么?

3 个答案:

答案 0 :(得分:5)

格式列仅适用于datetimedatechoice类型。

对于datetimedate,它代表Y-m-d H:i:s之类的日期格式以及choice的选项数组。

我没有找到任何关于它的文档,所以我必须查看源代码。这是FormTypeParser类,实际解析FormType的位置,您可以看到格式字段的设置方式。

FormTypeParserTest课程中,您可以看到如何使用它。只需将format名称的字符串参数传递给其中一个可用类型,解析器就会处理它。

更新:您要在FormType课程中定义约束。

例如:

class TestType extends AbstractType
{
    /**
     * @Assert\Type("string")
     * @Assert\Length(min="10", max="255")
     * @Assert\Regex("/^[^<>]+$/i")
     */
    private $title;

    /**
     * @Assert\Type("string")
     * @Assert\Length(min="10", max="255")
     * @Assert\Regex("/^[^<>]+$/i")
     */
    private $content;

    /**
     * @Assert\Date()
     */
    private $created;

    public function getName()
    {
        return 'test';
    }
}

将被解析为:

enter image description here

ValidationParser in doParse()方法查找FormType类中定义的所有约束,然后为每个约定执行parseConstraint()方法。

如上所述,您也可以使用FormTypeParser。例如:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('created', 'date', array('label' => 'Created', 'format' => 'yyyy-MM-dd'))
        ->add('color', 'choice', array('label' => 'Color', 'choices' => array('grey' => '#CCCCCC', 'red' => '#FF0000')))
        ->add('save', 'submit');
}

将被解析为:

enter image description here

希望现在有所帮助!

答案 1 :(得分:2)

我提交了一个使用format属性验证元数据的拉取请求。

您可以看到此PR here

答案 2 :(得分:0)

正如您可以看到here,您可以在注释中指定过滤器,就像完成文档示例一样。

这个例子的一部分:

/**
 * This is the documentation description of your method, it will appear
 * on a specific pane. It will read all the text until the first
 * annotation.
 *
 * @ApiDoc(
 *  resource=true,
 *  description="This is a description of your API method",
 *  filters={
 *      {"name"="a-filter", "dataType"="integer"},
 *      {"name"="another-filter", "dataType"="string", "pattern"="(foo|bar) ASC|DESC"}
 *  }
 * )
 */
public function getAction()
{
}