5

私は現在、まだよく知らない NelmioApiDocBundle を使用しています。私が書いている API は、特定のユーザーのパスワードを変更するためのルートを提供する必要があります。ドキュメントには、パスワードを変更するには古いパスワードと新しいパスワードの両方が必要であると記載されている必要があります。と の違いの説明が見つからなかったので、前者はルートからのデータに使用され、後者は API 呼び出し自体に使用されているRequirementsParameters思います。

このようなドキュメントをアーカイブする最初の試みは、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_passwordおよびnew_passwordパラメーターとして表示されるようになりました。これらのパラメーターを必須としてマークするために、アノテーションを介して Symfony Constraint をプロパティに追加しました。

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

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

}

ただし、これらの注釈を使用するとプロパティが必須としてマークされますが、奇妙な出力が生成されます。

奇妙なドキュメンテーション

パラメータが 2 回、異なる形式で追加されていることに注意してください。を追加し@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 に答える