5

我目前正在使用 NelmioApiDocBundle,对此我还不是很熟悉。我正在编写的 API 必须提供更改特定用户密码的路径。文档应说明,要更改密码,旧密码和新密码都需要。由于我没有找到 和 之间区别的解释RequirementsParameters我猜第一个用于来自路由的数据,而后者用于 API 调用本身。

归档此类文档的第一次尝试是实现一个简单的模型,然后 JMSSerializerBundle 会自动转换:

class ChangePasswordParam
{
    /**
     * @Type("string")
     * @var string
     */
    protected $oldPassword;

    /**
     * @Type("string")
     * @var string
     */
    protected $newPassword;

}

控制器通过此操作方法接受 API 调用:

/**
 * Changes the password for a specific user.
 *
 * @Post("/{username}/changepassword")
 * @View()
 * @ApiDoc(
 *  description="Changes the password of a User",
 *  input="FQCN\ChangePasswordParam"
 * )
 *
 * @param string              $username
 * @param ChangePasswordParam $passwordParam
 *
 * @return Response
 */
public function changePasswordAction($username, ChangePasswordParam $passwordParam)
{
    /* ... */
}

这导致文档显示username为需求old_passwordnew_password参数。为了根据需要标记这些参数,我通过注释向属性添加了 Symfony 约束:

class ChangePasswordParam
{
    /**
     * @Type("string")
     * @Assert\NotNull()
     * @var string
     */
    protected $oldPassword;

    /**
     * @Type("string")
     * @Assert\NotNull()
     * @var string
     */
    protected $newPassword;

}

但是,虽然使用这些注释标记了所需的属性,但它确实会产生奇怪的输出:

奇怪的文档

注意到参数被添加了两次而且格式不同吗?添加@SerializedName("old_password")没有效果。关于这张票,问题仍然没有解决。

另一种接受动作数据的方法是使用自定义表单,它确实将属性标记为需要,但也不会生成正确的输出。更改ChangePasswordParam自定义表单:

class ChangePasswordParam extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('old_password', 'text');
        $builder->add('new_password', 'text');
    }


    /**
     * Returns the name of this type.
     *
     * @return string The name of this type
     */
    public function getName()
    {
        return 'change_password';
    }

}

导致此参数描述: 再次奇怪的文档

这些参数应该命名为“old_password”和“new_password”,我不知道如何归档。

提前致谢

4

1 回答 1

2

您的 @ApiDoc 注释应包含一个空的输入表单名称字段,如下所示:

* @ApiDoc(
*  description="Changes the password of a User",
*  input= {
*    "class" = "FQCN\ChangePasswordParam",
*    "name" = ""
*  }
* )

这将删除参数名称之前的表单名称。

于 2016-05-12T08:55:10.470 回答