Symfony2 フォームを使用して、API への POST および PUT リクエストを検証しています。フォームは、要求データを基になるエンティティにバインドし、エンティティを検証します。エラーの収集を除いて、すべてがうまく機能しています。私は FOSRestBundle を使用しており、Symfony\Component\HttpKernel\Exception\HttpException をステータス コード 400 でスローし、検証が失敗した場合はフォーム エラー メッセージを含むメッセージをスローしています。FOSRestBundle は、これを JSON 応答に変換します。これらすべてを実行する必要があるコントローラー メソッドは、次のようになります (すべてのフィールドがエラーをフォームにバブルします)。
protected function validateEntity(AbstractType $type, $entity, Request $request)
{
$form = $this->createForm($type, $entity);
$form->bind($request);
if (! $form->isValid()) {
$message = ['Invalid parameters passed.'];
foreach ($form->getErrors() as $error) {
$message[] = $error->getMessage();
}
throw new HttpException(Codes::HTTP_BAD_REQUEST, implode("\n", $message));
}
}
私が抱えている問題は、$form->getErrors() を使用してフォーム レベルのエラーを収集すると、エラー メッセージにしかアクセスできず、エラーが接続されているフィールドの名前にはアクセスできないことです。これは、POST または PUT パラメータが関連エンティティの ID に対応する場合に特に問題になります。無効な値が送信された場合、そのエラー メッセージは単純に「この値は無効です」であり、このコンテキストではあまり適切ではありません。理想的には、次のいずれかを実行したいと考えています。
- エラーごとに、それが接続されているフィールド名を取得して、「フィールド名: エラー メッセージ」のようなメッセージをフォーマットできるようにします。
- それが不可能な場合、無効なエンティティ タイプのエラー メッセージをカスタマイズして、「この値は無効です」よりも適切なメッセージが表示されるようにすることはできますか?