Symfony2: Talebi forma bağladıktan sonra form doğrulama hataları nasıl alınır


110

İşte saveActionkodum (formun verileri aktardığı yer)

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();
}

Sorum şu: eğer $form->isValid()geri dönerse hataları nasıl alırım false?

Yanıtlar:


117

Bunu yapmanın iki olası yolu var:

  • kullanıcıyı hata durumunda yeniden yönlendirmeyin ve {{ form_errors(form) }}şablon dosyası içinde görüntüleme
  • hata dizisine erişim $form->getErrors()

22
Önerdiğiniz ikinci şeyi yaptım ama form-> getErrors () boş bir dizi döndürdü.
putolaruan

2
İlkini de yaptım (w / php şablonları <? Php echo $ view ['form'] -> hatalar ($ form)?>) Ama yine de boş!
putolaruan

59
@mives error_bubblingHer alan için seçeneği açıkça belirleyerek form türünüzde true olarak ayarlamalısınız.
kgilden

5
Özel doğrulayıcılar kullanıyorsanız, Symfony bu doğrulayıcılar tarafından oluşturulan hataları $ form-> getErrors () içinde döndürmez.
Jay Sheth

13
$form->getErrors(true)Çocuk formlarının hatalarını da dahil edebilirsiniz
Chris

103

Symfony 2.3 / 2.4:

Bu işlev tüm hataları alır. "CSRF jetonu geçersiz. Lütfen formu yeniden göndermeyi deneyin" gibi formda olanlar. yanı sıra hiçbir hata köpürmesi olmayan form çocuklarında ek hatalar.

private function getErrorMessages(\Symfony\Component\Form\Form $form) {
    $errors = array();

    foreach ($form->getErrors() as $key => $error) {
        if ($form->isRoot()) {
            $errors['#'][] = $error->getMessage();
        } else {
            $errors[] = $error->getMessage();
        }
    }

    foreach ($form->all() as $child) {
        if (!$child->isValid()) {
            $errors[$child->getName()] = $this->getErrorMessages($child);
        }
    }

    return $errors;
}

Tüm hataları bir dize olarak almak için:

$string = var_export($this->getErrorMessages($form), true);

Symfony 2.5 / 3.0:

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

Dokümanlar:
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 alt: The method Form::getErrorsAsString() was removed)


1
Bu, mevcut Symfony 2.4 için en doğru cevap gibi görünüyor.
Slava Fomin II

@Flip it 2.5'te mükemmel çalışıyor
iarroyo

1
Harika yanıt ANCAK getErrorMessages Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller bileşeninde eksik $errors[$child->getName()] = $this->getErrorMessages($child);olduğu için istisna atıyordu . Bu yüzden onu$form_errors[$child->getName()] = $child->getErrorsAsString();
Ahad Ali

3
@AhadAli bu özyinelemeli bir işlevdir, bu nedenle kod parçacığını bu işlevselliğe ihtiyaç duyduğunuz sınıfa koyduğunuzda kendisini arayabilir. "Düzeltmeniz", iç içe geçmiş formlara ulaşmanızı engelleyecektir. Diğer 37 kişi için çalıştı, sizin için de çalışmalı;)
çevirin

@Flip Ah üzgünüm, sadece bakıyordum $this->getErrorMessages()ve doğrudan bir denetleyicinin içinde ve Symfony api'nin bir parçası olarak çağrıldığını düşündüm.
Ahad Ali

47

Benim için işe yarayan çözüm aşağıdadır. Bu işlev bir denetleyicide bulunur ve tüm hata mesajlarının ve bunlara neden olan alanın yapılandırılmış bir dizisini döndürür.

Symfony 2.0:

private function getErrorMessages(\Symfony\Component\Form\Form $form) {
    $errors = array();
    foreach ($form->getErrors() as $key => $error) {
        $template = $error->getMessageTemplate();
        $parameters = $error->getMessageParameters();

        foreach($parameters as $var => $value){
            $template = str_replace($var, $value, $template);
        }

        $errors[$key] = $template;
    }
    if ($form->hasChildren()) {
        foreach ($form->getChildren() as $child) {
            if (!$child->isValid()) {
                $errors[$child->getName()] = $this->getErrorMessages($child);
            }
        }
    }

    return $errors;
}

Symfony 2.1 ve daha yenisi:

private function getErrorMessages(\Symfony\Component\Form\Form $form) {      
    $errors = array();

    if ($form->hasChildren()) {
        foreach ($form->getChildren() as $child) {
            if (!$child->isValid()) {
                $errors[$child->getName()] = $this->getErrorMessages($child);
            }
        }
    } else {
        foreach ($form->getErrors() as $key => $error) {
            $errors[] = $error->getMessage();
        }   
    }

    return $errors;
}

5
Geliştirilmiş gist.github.com/2011671 ama yine de istediğim şey değil. Dizi anahtarlarının alan adları olmasını istiyorum, ancak bunlar değil.
umpirsky

9
@SalmanPK Twig yukarıdaki kodda hiçbir yerde referans gösterilmemiştir. Yorumunuzu anladığıma inanmıyorum.
Icode4food

1
İşte önceki öz için bir düzeltme, bu Symfony 2.1.7 altında çalışıyor. gist.github.com/WishCow/5101428
K. Norbert

Görünüşe göre Symfony2.1'deki örneğinizde bir yazım hatası $this->getFormErrorsolması gerekiyor$this->getErrorMessages
Mick

@umpirsky Alan adını almak için şunu aldım: $ child-> getConfig () -> getOptions () ['label']
Öğrenmem

35

Doğrulayıcıyı belirli bir varlık için hataları almak için kullanın

if( $form->isValid() )
{
    // ...
}
else
{
    // get a ConstraintViolationList
    $errors = $this->get('validator')->validate( $user );

    $result = '';

    // iterate on it
    foreach( $errors as $error )
    {
        // Do stuff with:
        //   $error->getPropertyPath() : the field that caused the error
        //   $error->getMessage() : the error message
    }
}

API referansı:


Teşekkürler, ihtiyacım olan +1
Phill Pafford

4
Her varlığı ayrı ayrı doğrulamanın iyi bir yaklaşım olduğundan emin değilim. Ya karmaşık hiyerarşik formunuz varsa? İkinci sorun, doğrulamanın iki kez gerçekleşmesidir.
Slava Fomin II

3
@SlavaFominII - "İkinci sorun, doğrulamanın iki kez gerçekleşmesidir" - İyi nokta, hiçbir şey yenilenmiyor! Sonra aynı hata listesi!
BentCoder

20

Şu anda SF 2.6.3 kullanan düzgün (çevrilebilir) mesajlar almak için işte benim son işlevim (yukarıdakilerin hiçbiri artık çalışmıyor gibi görünüyor):

 private function getErrorMessages(\Symfony\Component\Form\Form $form) {      
    $errors = array();
    foreach ($form->getErrors(true, false) as $error) {
        // My personnal need was to get translatable messages
        // $errors[] = $this->trans($error->current()->getMessage());
        $errors[] = $error->current()->getMessage();
    }

    return $errors;
}

Form :: getErrors () yöntemi artık ikinci bağımsız değişkeni ($ flatten) true olarak değiştirmediğiniz sürece FormErrorIterator örneğini döndürdüğünden . (Daha sonra bir FormError örneği döndürür ve current () yöntemi olmadan doğrudan getMessage () yöntemini çağırmanız gerekir:

 private function getErrorMessages(\Symfony\Component\Form\Form $form) {      
    $errors = array();
    foreach ($form->getErrors(true, true) as $error) {
        // My personnal need was to get translatable messages
        // $errors[] = $this->trans($error->getMessage());
        $errors[] = $error->getMessage();
    }

    return $errors;
}

)

Aslında en önemli şey, hataları almak için ilk argümanı doğru olarak ayarlamaktır. İkinci bağımsız değişkeni ($ flatten) varsayılan değerine ( true ) bırakmak FormError örneklerini döndürürken , false değerine ayarlandığında FormErrorIterator örneklerini döndürür.


Aynı şeyleri kullanmak güzel.
Zararlı Organik

değil mi? :) @KidBinary
Cedo

Kesinlikle muhteşem dostum
Hasarlı Organik

Daha iyi seçenek: $ error = array_map (function ($ item) {return $ item-> current () -> getMessage ();}, $ campaignForm-> getErrors (true, false));
Enrique Quero

Symfony 2.7 için iyi çözüm
Yann Chabot

16

Flash mesajlarım için mutluydum $form->getErrorsAsString()

Düzenleme (Benji_X80'den): SF3 kullanımı için $form->getErrors(true, false);


3
Bunun eski bir cevap olduğunu biliyorum ama ileride başvurmak için: This method should only be used to help debug a form.( kaynak )
cheesemacfly

getErrorsAsString () 3.0'da kullanımdan kaldırılmıştır, şunu kullanın: $ form-> getErrors (true, false);
Benji_X80

15

Kullanımdan kaldırılmış herhangi bir işlev olmaksızın symfony 2.1 ve daha yenisi için işlev:

/**
 * @param \Symfony\Component\Form\Form $form
 *
 * @return array
 */
private function getErrorMessages(\Symfony\Component\Form\Form $form)
{
    $errors = array();

    if ($form->count() > 0) {
        foreach ($form->all() as $child) {
            /**
             * @var \Symfony\Component\Form\Form $child
             */
            if (!$child->isValid()) {
                $errors[$child->getName()] = $this->getErrorMessages($child);
            }
        }
    } else {
        /**
         * @var \Symfony\Component\Form\FormError $error
         */
        foreach ($form->getErrors() as $key => $error) {
            $errors[] = $error->getMessage();
        }
    }

    return $errors;
}

Bu yazıya yeni bir cevap verecektim ama beni yumruk atmış gibisin. Yöntem çağrılarının neden bulunamadığını anlamak için kaynak koduna bakmam gerekti.
Dr.Knowitall

Bunun, hata köpürmesi true olarak ayarlanmış öğelerden hata almadığını fark ettim. SF2.4
kinghfb

@stwe ilk IFifadenin amacı nedir? Neden birbirini dışlar? Görebildiğim kadarıyla: formun kendi hataları olduğu gibi çocuklar da olabilir.
Slava Fomin II

4

Translated Form Hata Mesajları (Symfony2.1)

Bu bilgiyi bulmak için çok uğraşıyorum, bu yüzden kesinlikle form hatalarının çevirisi üzerine bir not eklemeye değer olduğunu düşünüyorum.

@Icode4foodcevap, bir formdaki tüm hataları döndürür. Ancak, döndürülen dizi, mesaj çoğullaşmasını veya çevirisini hesaba katmaz .

@Icode4foodBir combo elde etmek için foreach yanıt döngüsünü değiştirebilirsiniz :

  • Belirli bir formdaki tüm hataları alın
  • Çevrilmiş bir hata döndür
  • Gerekirse çoğulculuğu hesaba katın

İşte burada:

foreach ($form->getErrors() as $key => $error) {

   //If the message requires pluralization
    if($error->getMessagePluralization() !== null) {
        $errors[] = $this->container->get('translator')->transChoice(
            $error->getMessage(), 
            $error->getMessagePluralization(), 
            $error->getMessageParameters(), 
            'validators'
            );
    } 
    //Otherwise, we do a classic translation
    else {
        $errors[] = $this->container->get('translator')->trans(
            $error->getMessage(), 
            array(), 
            'validators'
            );
    }
}

Bu cevap 3 farklı gönderiden derlenmiştir:


Sadece versiyonunuzu denedim ve gitti Fatal Error: Call to undefined method Symfony\Component\Form\FormError::getMessagePluralization(). Bunun sadece Symfony 2.1 için olduğundan şüpheleniyorum?
Çar Pino

4

SYMFONY 3.X

Burada verilen diğer SF 3.X yöntemleri benim için işe yaramadı çünkü forma boş veri gönderebilirdim (ancak NotNull / NotBlanck kısıtlamalarım var). Bu durumda hata dizisi şöyle görünür:

string(282) "ERROR: This value should not be blank.
ERROR: This value should not be blank.
ERROR: This value should not be blank.
ERROR: This value should not be blank.
ERROR: This value should not be blank.
ERROR: This value should not be null.
name:
    ERROR: This value should not be blank.
"

Bu pek kullanışlı değil. Ben de bunu yaptım:

public function buildErrorArray(FormInterface $form)
{
    $errors = [];

    foreach ($form->all() as $child) {
        $errors = array_merge(
            $errors,
            $this->buildErrorArray($child)
        );
    }

    foreach ($form->getErrors() as $error) {
        $errors[$error->getCause()->getPropertyPath()] = $error->getMessage();
    }

    return $errors;
}

Hangisi bunu döndürür:

array(7) {
  ["data.name"]=>
  string(31) "This value should not be blank."
  ["data.street"]=>
  string(31) "This value should not be blank."
  ["data.zipCode"]=>
  string(31) "This value should not be blank."
  ["data.city"]=>
  string(31) "This value should not be blank."
  ["data.state"]=>
  string(31) "This value should not be blank."
  ["data.countryCode"]=>
  string(31) "This value should not be blank."
  ["data.organization"]=>
  string(30) "This value should not be null."
}

3

Doğrulayıcı hizmetini kısıtlama ihlallerini almak için de kullanabilirsiniz:

$errors = $this->get('validator')->validate($user);

6
Bu, nesneyi doğrular ancak formu doğrulamaz. Örneğin, CRSF belirteci hatanın nedeni olsaydı, mesaj dahil edilmezdi.
Icode4food

3

Çevrilmiş Form Hata Mesajları (Symfony2.3)

Problemi çözme versiyonum:

/src/Acme/MyBundle/Resources/config/services.yml

services:
    form_errors:
        class: Acme\MyBundle\Form\FormErrors

/src/Acme/MyBundle/Form/FormErrors.php

<?php
namespace Acme\MyBundle\Form;

class FormErrors
{
    public function getArray(\Symfony\Component\Form\Form $form)
    {
        return $this->getErrors($form);
    }

    private function getErrors($form)
    {
        $errors = array();

        if ($form instanceof \Symfony\Component\Form\Form) {

            // соберем ошибки элемента
            foreach ($form->getErrors() as $error) {

                $errors[] = $error->getMessage();
            }

            // пробежимся под дочерним элементам
            foreach ($form->all() as $key => $child) {
                /** @var $child \Symfony\Component\Form\Form */
                if ($err = $this->getErrors($child)) {
                    $errors[$key] = $err;
                }
            }
        }

        return $errors;
    }
}

/src/Acme/MyBundle/Controller/DefaultController.php

$form = $this->createFormBuilder($entity)->getForm();
$form_errors = $this->get('form_errors')->getArray($form);
return new JsonResponse($form_errors);

Symfony 2.5'te tüm alan hatalarını çok kolay bir şekilde alabilirsiniz:

    $errors = array();
    foreach ($form as $fieldName => $formField) {
        foreach ($formField->getErrors(true) as $error) {
            $errors[$fieldName] = $error->getMessage();
        }
    }

3

İçin Symfony 3.2 ve kullanımı bu yukarıda,

public function buildErrorArray(FormInterface $form)
{
    $errors = array();

    foreach ($form->getErrors() as $key => $error) {
        if ($form->isRoot()) {
            $errors['#'][] = $error->getMessage();
        } else {
            $errors[] = $error->getMessage();
        }
    }

    foreach ($form->all() as $child) {
        if (!$child->isValid()) {
            $errors[$child->getName()] = (string) $child->getErrors(true, false);
        }
    }
    return $errors;
}

Her hata açıklama metninde can sıkıcı ' Hata: ' metninden kurtulmak istiyorsanız str_replace kullanın .

$errors[$child->getName()] = str_replace('ERROR:', '', (string) $child->getErrors(true, false));

2

Özel doğrulayıcılar kullanıyorsanız Symfony, içinde bu doğrulayıcılar tarafından oluşturulan hataları döndürmez $form->getErrors(). $form->getErrorsAsString()ihtiyacınız olan tüm hataları döndürür, ancak çıktısı ne yazık ki bir dizi değil, bir dizge olarak biçimlendirilmiştir.

Tüm hataları almak için kullandığınız yöntem (nereden geldiklerine bakılmaksızın), kullandığınız Symfony'nin hangi sürümünü kullandığınıza bağlıdır.

Önerilen çözümlerin çoğu, tüm alt formları tarayan ve ilgili hataları tek bir diziye çıkaran özyinelemeli bir işlev oluşturmayı içerir. Symfony 2.3'ün $form->hasChildren()işlevi yoktur, ancak vardır $form->all().

Herhangi bir formdaki tüm hataları ayıklamak için kullanabileceğiniz Symfony 2.3 için bir yardımcı sınıf. (Yapro tarafından Symfony'nin github hesabındaki ilgili bir hata bileti üzerine yapılan bir yorumun koduna dayanmaktadır.)

namespace MyApp\FormBundle\Helpers;

use Symfony\Component\Form\Form;

class FormErrorHelper
{
    /**
     * Work-around for bug where Symfony (2.3) does not return errors from custom validaters,
     * when you call $form->getErrors().
     * Based on code submitted in a comment here by yapro:
     * https://github.com/symfony/symfony/issues/7205
     *
     * @param Form $form
     * @return array Associative array of all errors
     */
    public function getFormErrors($form)
    {
        $errors = array();

        if ($form instanceof Form) {
            foreach ($form->getErrors() as $error) {
                $errors[] = $error->getMessage();
            }

            foreach ($form->all() as $key => $child) {
                /** @var $child Form */
                if ($err = $this->getFormErrors($child)) {
                    $errors[$key] = $err;
                }
            }
        }

        return $errors;
    }
}

Arama kodu:

namespace MyApp\ABCBundle\Controller;

use MyApp\FormBundle\Helpers;

class MyController extends Controller
{
    public function XYZAction()
    {
        // Create form.

        if (!$form->isValid()) {
            $formErrorHelper = new FormErrorHelper();
            $formErrors = $formErrorHelper->getFormErrors($form);

            // Set error array into twig template here.
        }
    }

}

2

@ Jay Seth'in cevabına dayanarak, özellikle Ajax Formları için FormErrors sınıfının bir versiyonunu yaptım:

// src/AppBundle/Form/FormErrors.php
namespace AppBundle\Form;

class FormErrors
{

    /**
     * @param \Symfony\Component\Form\Form $form
     *
     * @return array $errors
     */
    public function getArray(\Symfony\Component\Form\Form $form)
    {
        return $this->getErrors($form, $form->getName());
    }

    /**
     * @param \Symfony\Component\Form\Form $baseForm
     * @param \Symfony\Component\Form\Form $baseFormName
     *
     * @return array $errors
     */
    private function getErrors($baseForm, $baseFormName) {
        $errors = array();
        if ($baseForm instanceof \Symfony\Component\Form\Form) {
            foreach($baseForm->getErrors() as $error) {
                $errors[] = array(
                    "mess"      => $error->getMessage(),
                    "key"       => $baseFormName
                );
            }

            foreach ($baseForm->all() as $key => $child) {
                if(($child instanceof \Symfony\Component\Form\Form)) {
                    $cErrors = $this->getErrors($child, $baseFormName . "_" . $child->getName());
                    $errors = array_merge($errors, $cErrors);
                }
            }
        }
        return $errors;
    }
}

Kullanım (örneğin eyleminizde):

$errors = $this->get('form_errors')->getArray($form);

Symfony sürümü: 2.8.4

Örnek JSON yanıtı:

{
    "success": false,
    "errors": [{
        "mess": "error_message",
        "key": "RegistrationForm_user_firstname"
    }, {
        "mess": "error_message",
        "key": "RegistrationForm_user_lastname"
    }, {
        "mess": "error_message",
        "key": "RegistrationForm_user_email"
    }, {
        "mess": "error_message",
        "key": "RegistrationForm_user_zipCode"
    }, {
        "mess": "error_message",
        "key": "RegistrationForm_user_password_password"
    }, {
        "mess": "error_message",
        "key": "RegistrationForm_terms"
    }, {
        "mess": "error_message2",
        "key": "RegistrationForm_terms"
    }, {
        "mess": "error_message",
        "key": "RegistrationForm_marketing"
    }, {
        "mess": "error_message2",
        "key": "RegistrationForm_marketing"
    }]
}

Hata nesnesi, girdi DOM öğesinin kimliği olan "anahtar" alanını içerir, böylece hata mesajlarını kolayca doldurabilirsiniz.

Ebeveynin içinde alt formlarınız varsa, cascade_validationseçeneği üst formun içine eklemeyi unutmayın setDefaults.


1

Twig hata ekranı ile kullanım için Symfony 2.1'den itibaren, işlevi basitçe geri getirmek yerine bir FormError eklemek için değiştirdim, bu şekilde hatalar üzerinde daha fazla kontrole sahip olursunuz ve her bir girişte error_bubbling kullanmak zorunda kalmazsınız. Aşağıdaki şekilde ayarlamazsanız {{form_errors (form)}} boş kalacaktır:

/**
 * @param \Symfony\Component\Form\Form $form
 *
 * @return void
 */
private function setErrorMessages(\Symfony\Component\Form\Form $form) {      

    if ($form->count() > 0) {
        foreach ($form->all() as $child) {
            if (!$child->isValid()) {
                if( isset($this->getErrorMessages($child)[0]) ) {
                    $error = new FormError( $this->getErrorMessages($child)[0] );
                    $form->addError($error);
                }
            }
        }
    }

}

1

$ form-> getErrors () benim için çalışıyor.


1

Bu çözümü buldum. En son Symfony 2.4 ile sağlam çalışır .

Bazı açıklamalar yapmaya çalışacağım.

Ayrı doğrulayıcı kullanma

Diğer yazarların önerdiği gibi, varlıkları doğrulamak ve kısıtlama ihlali mesajları döndürmek için ayrı doğrulama kullanmanın kötü bir fikir olduğunu düşünüyorum.

  1. Tüm varlıkları manuel olarak doğrulamanız, doğrulama gruplarını belirtmeniz, vb. Gerekir. Karmaşık hiyerarşik formlarda bu hiç pratik değildir ve hızla kontrolden çıkacaktır.

  2. Bu şekilde formu iki kez doğrulayabilirsiniz: biri formla ve diğeri ayrı doğrulayıcıyla. Bu performans açısından kötü bir fikir.

Hata mesajlarını toplamak için form türünü çocuklarla yinelemeli olarak yinelemenizi öneririm.

Özel EĞER ifadesiyle önerilen bazı yöntemleri kullanma

Başka bir yazar tarafından önerilen bazı cevaplar, aşağıdaki gibi birbirini dışlayan EĞER ifadeleri içerir: if ($form->count() > 0)veya if ($form->hasChildren()).

Görebildiğim kadarıyla, her formun yanı sıra çocuklar da olabilir. Symfony Forms bileşeni konusunda uzman değilim , ancak pratikte formun kendisinde CSRF koruma hatası veya ekstra alan hatası gibi bazı hataları almayacaksınız . Bu ayrımı kaldırmanızı öneririm.

Normal olmayan sonuç yapısını kullanma

Bazı yazarlar, tüm hataları düz bir dizinin içine koymayı önerir. Dolayısıyla, formun kendisinin ve alt öğelerinin tüm hata mesajları, farklı indeksleme stratejileriyle aynı diziye eklenecektir: türün kendi hataları için sayı temelli ve alt hatalar için isme dayalı. Formun normalleştirilmiş veri yapısını kullanmanızı öneririm:

errors:
    - "Self error"
    - "Another self error"

children
    - "some_child":
        errors:
            - "Children error"
            - "Another children error"

        children
            - "deeper_child":
                errors:
                    - "Children error"
                    - "Another children error"

    - "another_child":
        errors:
            - "Children error"
            - "Another children error"

Bu şekilde sonuç daha sonra kolayca yinelenebilir.

Çözümüm

İşte bu soruna çözümüm:

use Symfony\Component\Form\Form;

/**
 * @param Form $form
 * @return array
 */
protected function getFormErrors(Form $form)
{
    $result = [];

    // No need for further processing if form is valid.
    if ($form->isValid()) {
        return $result;
    }

    // Looking for own errors.
    $errors = $form->getErrors();
    if (count($errors)) {
        $result['errors'] = [];
        foreach ($errors as $error) {
            $result['errors'][] = $error->getMessage();
        }
    }

    // Looking for invalid children and collecting errors recursively.
    if ($form->count()) {
        $childErrors = [];
        foreach ($form->all() as $child) {
            if (!$child->isValid()) {
                $childErrors[$child->getName()] = $this->getFormErrors($child);
            }
        }
        if (count($childErrors)) {
            $result['children'] = $childErrors;
        }
    }

    return $result;
}

Umarım birine yardımcı olur.


@weaverryan çözümüme bir göz atabilir misin lütfen? Geçerli mi, yoksa bir sakınca veya yanlış anlama var mı? Teşekkür ederim!
Slava Fomin II

1

SYMFONY 3.1

Hataların görüntülenmesini işlemek için basitçe statik bir yöntem uyguladım

static function serializeFormErrors(Form\Form $form)
{
    $errors = array();
    /**
     * @var  $key
     * @var Form\Form $child
     */
    foreach ($form->all() as $key => $child) {
        if (!$child->isValid()) {
            foreach ($child->getErrors() as $error) {
                $errors[$key] = $error->getMessage();
            }
        }
    }

    return $errors;
}

Yardım etmeyi umuyorum


1

Symfony 3 ve daha yenisi

Yakın zamanda bir form hataları ağacı oluşturan bir işlev yaptım. Bu, hata listesinin ön uca geri döndürülmesinde yardımcı olacaktır. Bu, aşağıdakilere sahip form türlerine dayanmaktadır:

'error_bubbling' => false

Kod:

public static function getFormErrorsTree(FormInterface $form): array
{
    $errors = [];

    if (count($form->getErrors()) > 0) {
        foreach ($form->getErrors() as $error) {
            $errors[] = $error->getMessage();
        }
    } else {
        foreach ($form->all() as $child) {
            $childTree = self::getFormErrorsTree($child);

            if (count($childTree) > 0) {
                $errors[$child->getName()] = $childTree;
            }
        }
    }

    return $errors;
}

Çıktı:

Array
(
    [name] => Array
        (
            [0] => This value is not valid.
        )

    [emails] => Array
        (
            [0] => Array
                (
                    [0] => Given e-mail is not valid.
                    [1] => Given e-mail is not valid #2.
                )
            [1] => Array
                (
                    [0] => Given e-mail is not valid.
                    [1] => Given e-mail is not valid #2.
                )

        )

)

Uyarı : Daha derin seviyeli alanlardan gelen hataların, daha yüksek seviyede hatalar varsa üzerine yazılabileceğini biliyorum, ancak bu benim kullanımım içindir.



0

Symfony 2.1 için:

Bu, diğer birçok çözümü bir araya getiren son çözümüm:

protected function getAllFormErrorMessages($form)
{
    $retval = array();
    foreach ($form->getErrors() as $key => $error) {
        if($error->getMessagePluralization() !== null) {
            $retval['message'] = $this->get('translator')->transChoice(
                $error->getMessage(), 
                $error->getMessagePluralization(), 
                $error->getMessageParameters(), 
                'validators'
            );
        } else {
            $retval['message'] = $this->get('translator')->trans($error->getMessage(), array(), 'validators');
        }
    }
    foreach ($form->all() as $name => $child) {
        $errors = $this->getAllFormErrorMessages($child);
        if (!empty($errors)) {
           $retval[$name] = $errors; 
        }
    }
    return $retval;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.