Symfony2 nieprawidłowy formularz bez błędów

Mam problem z wygenerowanym przez Symfony2 formularzem CRUD. (Z dokumentami MongoDB, ale nie sądzę, że jest to związane)

W metodzie createAction() mojego kontrolera, kiedy debuguję wynik formularza:

$form->isValid() // returns false

$form->getErrors() // returns en empty array(0) {}

Więc nie dostaję nic za pomocą form_errors(form) na moim szablonie gałązki (co wydaje się normalne z powodu $form->getErrors() empty return)

I zapisane wartości nie są zastępowane w formie...

Czy ktoś ma jakiś pomysł?
Author: Flo-Schield-Bobby, 2012-06-26

11 answers

Pierwszą rzeczą do zrozumienia jest Walidacja odbywa się na modelu, nie formularza. Formularz może zawierać błędy, ale tylko wtedy, gdy ma pole zmapowane do właściwości, które nie sprawdza się. Jeśli więc twój formularz nie zawiera nieprawidłowego pola (być może twierdzenie NotNull dotyczące właściwości, która nie znajduje się w formularzu), nie wyświetli on błędu.

Drugą rzeczą jest to, że $form->getErrors() wyświetli tylko błędy na tym poziomie, każdy potomek formularza może zawierać własne błędy. Więc jeśli chcesz sprawdzić błędy, możesz powinien przechodzić przez pola i wywoływać getErrors na każdym polu. Metoda getErrors na klasie Form może być w ten sposób myląca.

 57
Author: Peter Kruithof,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-27 19:47:01

Aby debugować formularz, użyj $form->getErrorsAsString() zamiast $form->getErrors().

$form->getErrorsAsString() powinien być używany tylko do debugowania form...it będzie zawierać błędy każdego elementu potomnego, co nie jest przypadkiem $form->getErrors().

Jak wspomina Piotr, $form->getErrors() nie zwróci sumy wszystkich błędów dziecięcych form.

Aby zrozumieć, w jaki sposób formularz może być nieprawidłowy i mieć getErrors() zwracającą pustą tablicę, możesz przyjrzeć się metodzie isValid() klasy symfony form. Jak widać, istnieją 2 przypadki, w których formularz nie jest ważny, pierwszy test dla formularza ogólnego, a drugi test przypadku dla każdego elementu potomnego.

public function isValid()
{
    //...

    //CASE I : IF CHILD ELEMENTS HAVE ERRORS, $this->errors WILL CONTAIN
    //THE ERROR ON THE CHILD ELEMENT AND NOT ON THE GENERAL 'errors' FIELD 
    //ITSELF

    if (count($this->errors) > 0) {
        return false;
    }

    //CASE II: AND THIS IS WHY WE ARE TESTING THE CHILD ELEMENTS AS WELL
    //TO CHECK WHETHER THERE ARE VALID OR NOT

    if (!$this->isDisabled()) {
        foreach ($this->children as $child) {
            if (!$child->isValid()) {
                return false;
            }
        }
    }

    return true;
}

Dlatego każdy potomek formularza może zawierać błąd, ale $form->getErrors() nie zwróci wszystkich błędów. Biorąc pod uwagę, że formularz zawiera wiele elementów potomnych, zwykle będzie mieć $form - >getErrors () z błędem CSRF, jeśli CSRF nie jest poprawny.

 59
Author: Mick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-18 13:27:34

Aktualizacja dla Symfony 2.6

Więc w zależności od wersji Symfony2:

Symfony2.3

die($form->getErrorsAsString());

Od symfony2.5, funkcja getErrorsAsString() jest przestarzała (zostanie usunięta w Symfony3) i należy użyć następującej metody:

die((string) $form->getErrors());     // Main errors
die((string) $form->getErrors(true)); // Main and child errors

Począwszy od symfony2.6 , możesz również użyć funkcji dump (dev environment), jeśli aktywowałeś DebugBundle:

dump((string) $form->getErrors());     // Main errors
dump((string) $form->getErrors(true)); // Main and child errors
 46
Author: COil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-15 12:28:48

Mam ten sam problem. Dla mnie formularz nie był poprawny, ale nie mogłem uzyskać żadnych błędów za pomocą $form->getErrors() lub $form->getErrorsAsString(). Później okazało się, że zapomniałem przekazać token CSRF do formularza, aby nie został przesłany, a $form->handleRequest($request) nic nie zrobił (bez walidacji). Jak zobaczyłem odpowiedź @pit, próbowałem użyć

$form->submit($request);

$form->getErrorsAsString();

Zwrócił błąd:

Błąd: token CSRF jest nieprawidłowy. Proszę spróbować ponownie przesłać formularz.

Oto wyjaśnienie w dokumentacji Symfony2: http://symfony.com/doc/current/book/forms.html#handling-form-submissions

 18
Author: micmia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-12 16:40:36

Dla Symfony (>=3.2-4), możesz użyć :

foreach($form->getErrors(true, false) as $er) {
    print_r($er->__toString());
}

Aby zobaczyć błędy oczywiście.

 4
Author: Somen Diégo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-18 09:54:08

Dla mnie formularz nie został przesłany, nawet jeśli miałem przycisk submit. Dodałem kod aby rozwiązać problem

$request = $this->get('request');
if($request->isMethod("POST")){
      $form->submit($request);
        if($form->isValid()){
        // now true
        }
}
 3
Author: pit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-11 20:02:22

Począwszy od Symfony 3 Należy używać nowej implementacji:

$errors = (string) $form->getErrors(true, false);

Zwróci wszystkie błędy jako jeden ciąg znaków.

 3
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-25 11:19:26

Jeśli wysyłasz dane za pośrednictwem AJAX, Być może nie uwzględniłeś nazwy formularza w kluczach danych i dlatego jesteś "ofiarą" ...

# line 100 of Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php 
// Don't submit the form if it is not present in the request

Co oznacza, że podczas próby obsługi żądania, mechanizm przetwarzania żądania nie znalazł nazwy Twojego formularza wewnątrz danych GET / POST(czyli tablicy).

Kiedy renderujesz formularz w zwykły sposób, każde z jego pól zawiera nazwę formularza jako prefiks do atrybutu name my_form[child_field_name].

Podczas korzystania z ajax, dodaj nazwa Twojego formularza jako prefiks w datas !

data : {
    "my_form" : {
       "field_one" : "field_one_value"
       ...
    }
}
 2
Author: Stphane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-28 15:18:57

Tak to jest poprawne, co mówi Peter Kruithof W SF 2.8 jest to moja funkcja, aby uzyskać błędy pól

 private function getErrorsForm(\Symfony\Component\Form\Form $form)
{
    $response =  array();

    foreach ($form as $child) {
         foreach ($child->getErrors(true) as $error) {
            $response[$child->getName()][] = $error->getMessage();
         }
    }

    return $response;
}
 1
Author: ederrafo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-30 15:36:28

Natknąłem się na ten błąd i okazało się, że zapomniałem "obsłużyć" żądanie. Upewnij się, że masz to przy sobie...

public function editAction(Request $request)
{
    $form = $this->createForm(new CustomType(),$dataObject);
    /**  This next line is the one I'm talking about... */
    $form->handleRequest($request);
    if ($request->getMethod() == "POST") {
        if ($form->isValid()) {
        ...
 1
Author: Layton Everson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-14 05:30:44

Wygląda na to, że masz problem z walidacją. Formularz nie podlega walidacji po złożeniu. Zakładam, że używasz adnotacji do walidacji. Upewnij się, że masz to na górze istoty.

use Symfony\Component\Validator\Constraints as Assert;

A także to nad każdą właściwością

/**      
 * @Assert\NotBlank()      
 */

NotBlank() można zmienić na dowolne ograniczenie, aby dopasować je do swoich potrzeb.

Więcej informacji na temat walidacji można znaleźć na stronie: http://symfony.com/doc/current/book/validation.html

Więcej informacji na stronie można znaleźć: http://symfony.com/doc/current/book/validation.html#constraints

 0
Author: Dave Mascia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-28 01:19:06