Używam formularzy Symfony2 do sprawdzania poprawności żądań POST i PUT do API. Formularz obsługuje powiązanie danych żądania z jednostką podstawową, a następnie walidację jednostki. Wszystko działa całkiem dobrze, z wyjątkiem zbierania błędów. Używam FOSRestBundle i wyrzucam Symfony \ Component \ HttpKernel \ Exception \ HttpException z kodem statusu 400 i wiadomością zawierającą komunikaty o błędach formularza, jeśli sprawdzanie poprawności nie powiedzie się. FOSRestBundle obsługuje konwertowanie tego na odpowiedź JSON. Metoda kontroler muszę wykonać to wszystko wygląda następująco (wszystkie pola bańki swoje błędy do formularza):Otrzymuj wszystkie błędy wraz z polami, w których błąd jest podłączony do
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));
}
}
Mam problem jest, że kiedy zbierać błędów poprzez formularz na poziomie $ form- > getErrors() Mam dostęp tylko do komunikatu o błędzie, a nie do nazwy pola, do którego podłączony jest błąd. Jest to szczególny problem, gdy parametr POST lub PUT odpowiada identyfikatorowi powiązanej jednostki. W przypadku podania nieprawidłowej wartości komunikaty o błędach są po prostu "Ta wartość nie jest poprawna", co w tym kontekście nie jest zbyt dobre. Idealnie chciałabym zrobić jedną z następujących czynności:
- Dla każdego błędu zdobyć nazwy pola jest on podłączony do tak, że mogę sformatować wiadomość coś jak „nazwa_pola: Komunikat o błędzie”
- Jeśli to nie jest możliwe, czy można dostosować komunikat o błędzie dla nieprawidłowego typu jednostki, aby wyświetlało się coś lepszego niż "Ta wartość jest nieprawidłowa"?
dziękuję. W jakiś sposób przegapiłem opcję invalid_message w dokumentach. Dokładnie to, czego potrzebowałem. – Jeremy
Ostrzeżenie: getErrorsAsString jest przestarzałe i zostanie usunięte w 3.0 – wdev
Od wersji 3.0 jest prostsze: $ form-> getErrors (true, false); aby uzyskać błędy dziecka – Chopchop