Oto mój saveAction
kod (gdzie formularz przekazuje dane)
public function saveAction()
{
$user = OBUser();
$form = $this->createForm(new OBUserType(), $user);
if ($this->request->getMethod() == 'POST')
{
$form->bindRequest($this->request);
if ($form->isValid())
return $this->redirect($this->generateUrl('success_page'));
else
return $this->redirect($this->generateUrl('registration_form'));
} else
return new Response();
}
Moje pytanie brzmi: jak mogę uzyskać błędy w przypadku $form->isValid()
zwrotów false
?
error_bubbling
true w swoim typie formularza, jawnie ustawiając opcję dla każdego pola.$form->getErrors(true)
dołączyć błędy w formularzach podrzędnychSymfony 2.3 / 2.4:
Ta funkcja pobiera wszystkie błędy. Te w formularzu, takie jak „Token CSRF jest nieprawidłowy. Spróbuj ponownie przesłać formularz”. a także dodatkowe błędy w podrzędnych formularzach, które nie mają propagacji błędów.
Aby pobrać wszystkie błędy jako ciąg:
Symfony 2.5 / 3.0:
Dokumenty:
https://github.com/symfony/symfony/blob/master/UPGRADE-2.5.md#form https://github.com/symfony/symfony/blob/master/UPGRADE-3.0.md#form (at spód:
The method Form::getErrorsAsString() was removed
)źródło
$errors[$child->getName()] = $this->getErrorMessages($child);
wyjątek, ponieważ w komponencie Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller brakowało getErrorMessages . Więc zastąpiłem go$form_errors[$child->getName()] = $child->getErrorsAsString();
$this->getErrorMessages()
i pomyślałem, że jest wywoływany bezpośrednio w kontrolerze i części api Symfony.Poniżej znajduje się rozwiązanie, które działało dla mnie. Ta funkcja znajduje się w kontrolerze i zwróci uporządkowaną tablicę wszystkich komunikatów o błędach i pola, które je spowodowało.
Symfony 2.0:
Symfony 2.1 i nowsze:
źródło
$this->getFormErrors
że$this->getErrorMessages
w Twojej próbce w Symfony 2.1 powinna znajdować się literówkaUżyj walidatora, aby pobrać błędy dla określonej encji
Dokumentacja API:
źródło
Aby uzyskać prawidłowe (możliwe do przetłumaczenia) wiadomości, obecnie używające SF 2.6.3, oto moja ostatnia funkcja (ponieważ żadna z powyższych nie wydaje się już działać):
ponieważ metoda Form :: getErrors () zwraca teraz wystąpienie FormErrorIterator , chyba że zmienisz drugi argument ($ flatten) na true . (Następnie zwróci instancję FormError i będziesz musiał bezpośrednio wywołać metodę getMessage (), bez metody current ():
)
Najważniejsze jest, aby ustawić pierwszy argument na wartość true, aby uzyskać błędy. Pozostawienie drugiego argumentu ($ flatten) na jego domyślną wartość ( true ) zwróci instancje FormError , natomiast przy ustawieniu wartości false zwróci instancje FormErrorIterator .
źródło
W przypadku moich wiadomości błyskawicznych byłem zadowolony
$form->getErrorsAsString()
Edycja (z Benji_X80): Do użytku z SF3
$form->getErrors(true, false);
źródło
This method should only be used to help debug a form.
( źródło )Funkcja dla symfony 2.1 i nowszych, bez żadnej przestarzałej funkcji:
źródło
IF
stwierdzenia? Dlaczego wyklucza się wzajemnie? O ile się orientuję: forma może mieć swoje własne błędy, jak i dzieci.Przetłumaczone komunikaty o błędach w formularzu (Symfony2.1)
Bardzo ciężko mi było znaleźć te informacje, więc myślę, że zdecydowanie warto dodać uwagę na temat tłumaczenia błędów formularza.
@Icode4food
odpowiedź zwróci wszystkie błędy formularza. Jednak zwracana tablica nie uwzględnia ani liczby mnogiej, ani tłumaczenia komunikatu .Możesz zmodyfikować pętlę foreach
@Icode4food
odpowiedzi, aby uzyskać kombinację:Oto ona:
Ta odpowiedź została zebrana z 3 różnych postów:
źródło
Fatal Error: Call to undefined method Symfony\Component\Form\FormError::getMessagePluralization()
. Podejrzewam, że to dotyczy tylko Symfony 2.1?SYMFONY 3.X
Inne podane tutaj metody SF 3.X nie zadziałały, ponieważ mogłem przesłać puste dane do formularza (ale mam ograniczenia NotNull / NotBlanck). W tym przypadku ciąg błędu wyglądałby następująco:
Co nie jest zbyt przydatne. Więc zrobiłem to:
Który zwróciłby to:
źródło
Możesz również skorzystać z usługi walidatora, aby uzyskać informacje o naruszeniach ograniczeń:
źródło
Przetłumaczone komunikaty o błędach (Symfony2.3)
Moja wersja rozwiązania problemu:
/src/Acme/MyBundle/Resources/config/services.yml
/src/Acme/MyBundle/Form/FormErrors.php
/src/Acme/MyBundle/Controller/DefaultController.php
W Symfony 2.5 możesz bardzo łatwo uzyskać wszystkie błędy pól:
źródło
W przypadku Symfony 3.2 i nowszych użyj tego,
Użyj str_replace, jeśli chcesz pozbyć się irytującego tekstu „ Error: ” w każdym tekście opisu błędu.
źródło
Jeśli używasz niestandardowych walidatorów, Symfony nie zwraca błędów generowanych przez te walidatory w plikach
$form->getErrors()
.$form->getErrorsAsString()
zwróci wszystkie potrzebne błędy, ale jego wynik jest niestety sformatowany jako ciąg, a nie tablica.Metoda, której używasz, aby uzyskać wszystkie błędy (niezależnie od tego, skąd pochodzą), zależy od używanej wersji Symfony.
Większość sugerowanych rozwiązań polega na utworzeniu funkcji rekurencyjnej, która skanuje wszystkie formularze podrzędne i wyodrębnia odpowiednie błędy do jednej tablicy. Symfony 2.3 nie ma tej
$form->hasChildren()
funkcji, ale ją posiada$form->all()
.Oto klasa pomocnicza dla Symfony 2.3, której możesz użyć do wyodrębnienia wszystkich błędów z dowolnego formularza. (Jest oparty na kodzie z komentarza yapro do powiązanego zgłoszenia błędu na koncie github Symfony).
Kod telefoniczny:
źródło
Na podstawie odpowiedzi @Jay Seth stworzyłem wersję klasy FormErrors specjalnie dla Ajax Forms:
Użycie (np. W Twojej akcji):
Wersja Symfony: 2.8.4
Przykładowa odpowiedź JSON:
Obiekt błędu zawiera pole „klucz”, które jest identyfikatorem wejściowego elementu DOM, dzięki czemu można łatwo wypełnić komunikaty o błędach.
Jeśli masz formularze podrzędne wewnątrz rodzica, nie zapomnij dodać
cascade_validation
opcji wewnątrz formularza nadrzędnegosetDefaults
.źródło
W Symfony 2.1 i późniejszych do użytku z wyświetlaniem błędów Twig zmieniłem funkcję, aby dodać FormError zamiast po prostu je pobierać, dzięki czemu masz większą kontrolę nad błędami i nie musisz używać error_bubbling na każdym pojedynczym wejściu. Jeśli nie ustawisz go w poniższy sposób, {{form_errors (form)}} pozostanie puste:
źródło
$ form-> getErrors () działa dla mnie.
źródło
Wymyśliłem takie rozwiązanie. Działa solidnie z najnowszą wersją Symfony 2.4 .
Spróbuję udzielić kilku wyjaśnień.
Korzystanie z oddzielnego walidatora
Myślę, że to zły pomysł, aby używać oddzielnej walidacji do walidacji jednostek i zwracania komunikatów o naruszeniu ograniczeń, jak sugerowali inni autorzy.
Będziesz musiał ręcznie zweryfikować wszystkie jednostki, określić grupy walidacyjne itp. W przypadku złożonych form hierarchicznych jest to w ogóle niepraktyczne i szybko wymknie się spod kontroli.
W ten sposób będziesz walidować formularz dwukrotnie: raz z formularzem i raz z oddzielnym walidatorem. To zły pomysł z punktu widzenia wydajności.
Proponuję rekurencyjnie iterować typ formularza z jego dziećmi, aby zbierać komunikaty o błędach.
Korzystanie z niektórych sugerowanych metod z wyłączną instrukcją IF
Niektóre odpowiedzi sugerowane przez innych autorów zawierają wzajemnie wykluczające się stwierdzenia IF, takie jak:
if ($form->count() > 0)
lubif ($form->hasChildren())
.O ile wiem, każdy formularz może zawierać błędy, a także dzieci. Nie jestem ekspertem w komponentach Symfony Forms , ale w praktyce nie dostaniesz błędów samego formularza, takich jak błąd ochrony CSRF lub błąd dodatkowych pól . Proponuję usunąć tę separację.
Korzystanie ze zdenormalizowanej struktury wyników
Niektórzy autorzy sugerują umieszczenie wszystkich błędów w zwykłej tablicy. Zatem wszystkie komunikaty o błędach samego formularza i jego elementów potomnych zostaną dodane do tej samej tablicy z różnymi strategiami indeksowania: na podstawie liczb dla własnych błędów typu i na podstawie nazw dla błędów podrzędnych. Proponuję użyć znormalizowanej struktury danych w postaci:
W ten sposób wynik można łatwo powtórzyć później.
Moje rozwiązanie
Oto moje rozwiązanie tego problemu:
Mam nadzieję, że to komuś pomoże.
źródło
SYMFONY 3.1
Po prostu zaimplementowałem statyczną metodę obsługi wyświetlania błędów
Mam nadzieję, że pomogę
źródło
Symfony 3 i nowsze
Niedawno stworzyłem funkcję, która tworzy drzewo błędów formularza. Będzie to pomocne przy zwracaniu listy błędów z powrotem do front-endu. Opiera się to na typach formularzy, które mają:
Kod:
Wynik:
Uwaga : Wiem, że błędy z pól z głębszych poziomów mogą zostać nadpisane, jeśli wyższy poziom zawiera błędy, ale jest to celowe dla mojego użytku.
źródło
Dla Symfony 2.1:
Oto moje ostateczne rozwiązanie łączące wiele innych rozwiązań:
źródło