दिलचस्प पोस्ट
PhpMyadmin में अधिकतम निष्पादन समय SQL सर्वर में विदेशी कुंजी निर्भरता कैसे प्राप्त करें? वीबीए फ़ंक्शन कॉल में कोष्ठक के उपयोग को नियंत्रित करने वाले नियम क्या हैं? ओपनसीवी में Mat :: type () के साथ किस प्रकार का एक मॉट ऑब्जेक्ट है यह पता लगाने के लिए पीजी मणि स्थापित करने का प्रयास करते समय 'libpq-fe.h शीर्षलेख नहीं मिला EF4.3 में कोड प्रथम दृष्टिकोण में कॉलम के लिए दशमलव (16, 3) निर्धारित करें वेब टेक्स्ट को कॉपी करने के लिए अतिरिक्त जानकारी कैसे जोड़ें 3 डी दुनिया में डिवाइस के आंदोलन की गणना करने के लिए एक्सीलरोमीटर, जीरोस्कोप और कम्पास का उपयोग करना एससीएसएस के संकलन करते समय झूठी सकारात्मक "अपरिभाषित चर" त्रुटि एक बहु-थ्रेडेड प्रोग्राम में std :: स्ट्रिंग स्थानीय डायरेक्टरी से दुभाषिया में अजगर पैकेज आयात करें विरासत कोड से AngularJS को कॉल करें Gradle संस्करण 2.2 की आवश्यकता है। वर्तमान संस्करण 2.10 है आभासी नाशक और अपरिभाषित व्यवहार एक अल्पविराम का उपयोग करके NSString को विभाजित करें

Symfony2: फ़ॉर्म के अनुरोध को बाध्य करने के बाद फ़ॉर्म सत्यापन त्रुटियां कैसे प्राप्त करें

यहाँ मेरा saveAction कोड है (जहां फॉर्म डेटा को पास करता है)

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

मेरा प्रश्न यह है कि: $form->isValid() false मैं त्रुटियों को कैसे प्राप्त $form->isValid() ?

Solutions Collecting From Web of "Symfony2: फ़ॉर्म के अनुरोध को बाध्य करने के बाद फ़ॉर्म सत्यापन त्रुटियां कैसे प्राप्त करें"

आपके पास ऐसा करने के दो संभावित तरीके हैं:

  • उपयोगकर्ता को त्रुटि पर प्रदर्शित नहीं करें और {{ form_errors(form) }} टेम्पलेट फ़ाइल के अंतर्गत प्रदर्शित करें
  • $form->getErrors() रूप में एक्सेस त्रुटि सरणी

Symfony 2.3 / 2.4:

इस फ़ंक्शन को सभी त्रुटियां मिलती हैं "सीएसआरएफ टोकन जैसे फार्म पर मौजूद हैं, कृपया फॉर्म को पुनः भेजने का प्रयास करें।" साथ ही फार्म के बच्चों पर अतिरिक्त त्रुटियां हैं जिन पर कोई त्रुटि बुदबुदाती नहीं है।

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

स्ट्रिंग के रूप में सभी त्रुटियां प्राप्त करने के लिए:

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

Symfony 2.5 / 3.0:

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

डॉक्स:
https://github.com/symfony/symfony/blob/master/UPGRADE-2.5.md#form https://github.com/symfony/symfony/blob/master/UPGRADE-3.0.md#form (तल पर) : The method Form::getErrorsAsString() was removed )

नीचे मेरे लिए काम करने वाला समाधान है यह फ़ंक्शन नियंत्रक में है और सभी त्रुटि संदेशों और उन फ़ील्ड के एक संरचित सरणी को लौटा देगा जिससे उन्हें उत्पन्न हो सके।

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 और नए:

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

विशिष्ट इकाई के लिए त्रुटियों को प्राप्त करने के लिए वैधीकरण का उपयोग करें

 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 } } 

एपीआई संदर्भ:

  • ConstraintViolationList
  • ConstraintViolation

वर्तमान में एसएफ 2.6.3 का उचित (ट्रांसलेट करने योग्य) संदेश प्राप्त करने के लिए, यह मेरा अंतिम कार्य है (जैसा कि ऊपर की कोई भी अब काम नहीं करता है):

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

प्रपत्र :: getErrors () विधि के रूप में अब FormErrorIterator का एक उदाहरण देता है, जब तक कि आप दूसरे तर्क ($ फ़्लैटन ) को सही पर स्विच न करें। (यह फिर एक FormError उदाहरण लौटाएगा , और आपको वर्तमान () विधि के बिना, सीधे getMessage () विधि को कॉल करना होगा:

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

)

सबसे महत्वपूर्ण बात यह है कि त्रुटियों को पाने के लिए पहले तर्क को सच में सेट करना है। दूसरी तर्क ($ समतल) को अपने डिफ़ॉल्ट मान ( सच ) को छोड़कर , फॉर्मएर्रॉर इंस्टॉन्समेंट वापस आ जाएगा, जबकि फ़ायरएर्रेटरइटरेटर उदाहरणों को वापस लौटाएगा जब झूठे पर सेट होगा।

सिम्फोन 2.1 और नए के लिए किसी भी पदावनत फ़ंक्शन के बिना फ़ंक्शन:

 /** * @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; } 

मेरे फ्लैश संदेशों के लिए मैं $form->getErrorsAsString() खुश था

संपादित करें (Benji_X80 से): एसएफ 3 के लिए $form->getErrors(true, false);

अनुवादित फ़ॉर्म त्रुटि संदेश (Symfony2.1)

मैं इस जानकारी को खोजने के लिए काफी संघर्ष कर रहा हूं इसलिए मुझे लगता है कि फॉर्म त्रुटियों के अनुवाद पर एक नोट जोड़ना निश्चित रूप से अच्छा है।

@Icode4food उत्तर एक फॉर्म की सभी त्रुटियां वापस करेगा। हालांकि, लौटाए गए सरणी को या तो संदेश बहुवचन या अनुवाद को ध्यान में नहीं रखा जाता है।

आप @Icode4food उत्तर @Icode4food लूप को संशोधित कर सकते हैं:

  • एक विशेष रूप से सभी त्रुटियां प्राप्त करें
  • एक अनुवादित त्रुटि लौटाएं
  • यदि आवश्यक हो तो बहुवचन ले लें

यह रहा:

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

यह उत्तर 3 अलग-अलग पोस्टों से एक साथ रखा गया है:

  • Symfony2 – नियंत्रक में अनुवादित सत्यापन त्रुटियां प्राप्त करना
  • फॉर्म (संस्थाओं और डेटा एरेज़) के बिना सिम्फोनी 2 वैल्यूएटर घटक का उपयोग कैसे करें
  • Symfony2 – एक कंट्रोलर में एक फॉर्म से सभी त्रुटियां प्राप्त करना

बाधा का उल्लंघन करने के लिए आप मान्यकर्ता सेवा का भी उपयोग कर सकते हैं:

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

अनुवादित फ़ॉर्म त्रुटि संदेश (Symfony2.3)

समस्या को सुलझाने का मेरा संस्करण:

/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 में आप सभी फ़ील्ड त्रुटियों को बहुत आसान प्राप्त कर सकते हैं:

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

यदि आप कस्टम $form->getErrors() का उपयोग कर रहे हैं, तो Symfony उन $form->getErrors() द्वारा $form->getErrors() में त्रुटियों की वापसी नहीं करता है। $form->getErrorsAsString() आपके द्वारा आवश्यक सभी त्रुटियों को वापस करेगा, लेकिन इसका आउटपुट दुर्भाग्य से एक स्ट्रिंग के रूप में स्वरूपित है, एक सरणी के रूप में नहीं।

जिस विधि का उपयोग आप सभी त्रुटियों को प्राप्त करने के लिए करते हैं (भले ही वे कहां से आए हों), आप सिम्फनी के किस संस्करण का उपयोग कर रहे हैं पर निर्भर करता है।

सुझाए गए समाधानों में से ज्यादातर एक पुनरावर्ती समारोह का निर्माण करना शामिल है जो सभी बाल रूपों को स्कैन करता है, और प्रासंगिक त्रुटियों को एक सरणी में निकालता है। Symfony 2.3 में $form->hasChildren() फ़ंक्शन $form->hasChildren() , लेकिन इसके पास $form->all()

यहां Symfony 2.3 के लिए एक सहायक वर्ग है, जिसका उपयोग आप किसी भी रूप से सभी त्रुटियों को निकालने के लिए कर सकते हैं। (यह सिमफोनी के गिटब अकाउंट में किसी संबंधित बग टिकट पर याप्रो की टिप्पणी से कोड पर आधारित है।)

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

कॉलिंग कोड:

 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. } } } 

@जै सेठ के जवाब के आधार पर, मैंने विशेष रूप से अजाक्स फॉर्म के लिए फॉर्मएर्रोस कक्षा का एक संस्करण बनाया:

 // 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; } } 

उपयोग (जैसे आपकी कार्रवाई में):

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

Symfony संस्करण: 2.8.4

उदाहरण JSON प्रतिक्रिया:

 { "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" }] } 

त्रुटि ऑब्जेक्ट में "कुंजी" फ़ील्ड है, जो इनपुट DOM तत्व का आईडी है, ताकि आप आसानी से त्रुटि संदेश आबाद कर सकें।

यदि आपके पास माता-पिता के अंदर बच्चे का रूप है, तो माता-पिता के cascade_validation के cascade_validation अंदर cascade_validation विकल्प जोड़ने के लिए मत भूलना

SYMFONY 3.X

यहां दिए गए अन्य एसएफ 3.X विधियों मेरे लिए काम नहीं की क्योंकि मैं रिक्त आंकड़े फ़ॉर्म में जमा कर सकता हूं (लेकिन मेरे पास नोनल / नॉटबनल की कमी है)। इस मामले में त्रुटि स्ट्रिंग इस तरह दिखाई देगी:

 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. " 

जो बहुत उपयोगी नहीं है तो मैंने इसे बनाया:

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

जो कि वापस आ जाएगा:

 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." } 

टिमग त्रुटि डिस्प्ले के साथ उपयोग करने के लिए सिम्फनी 2.1 के बाद के लिए मैंने फ़ंक्शन को सिर्फ उन्हें पुनर्प्राप्त करने के बजाय एक FormError जोड़ने के लिए बदल दिया, इस तरह आपको त्रुटियों पर अधिक नियंत्रण है और प्रत्येक व्यक्तिगत इनपुट पर त्रुटि-बबुलिंग का उपयोग नहीं करना है। यदि आप इसे नीचे सेट नहीं करते हैं तो {{form_errors (form)}} खाली रहेगा:

 /** * @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); } } } } } 

$ form-> getErrors () मेरे लिए काम करता है

मैं इस समाधान के साथ आया था यह नवीनतम सिम्फनी 2.4 के साथ ठोस काम करता है।

मैं कुछ स्पष्टीकरण देने का प्रयास करूंगा

अलग सत्यापनकर्ता का उपयोग करना

मुझे लगता है कि यह एक बुरा विचार है कि अलग-अलग मान्यताओं का उपयोग करने के लिए संस्थाओं को मान्य करें और बाध्यता उल्लंघन के संदेश लौटाएं, जैसे कि अन्य लेखकों ने सुझाव दिया है

  1. आपको सभी संस्थाओं को मैन्युअल रूप से मान्य करना, सत्यापन समूहों को निर्दिष्ट करना होगा, आदि। जटिल श्रेणीबद्ध रूपों के साथ यह बिल्कुल व्यावहारिक नहीं है और हाथों से जल्दी से निकल जाएगा।

  2. इस प्रकार आप दो बार फॉर्म को मान्य कर लेंगे: एक बार फॉर्म के साथ और एक बार अलग-अलग वैधीकरण के साथ। प्रदर्शन परिप्रेक्ष्य से यह एक बुरा विचार है

मैं त्रुटि संदेशों को इकट्ठा करने के लिए इसके बच्चों के साथ फॉर्म प्रकार को दोबारा पुनरावृत करने का सुझाव देता हूं।

अनन्य IF स्टेटमेंट के साथ कुछ सुझाए गए विधियों का उपयोग करना

किसी अन्य लेखकों द्वारा सुझाए गए कुछ उत्तरों में ऐसे परस्पर अनन्य IF स्टेटमेंट शामिल हैं: if ($form->count() > 0) या if ($form->hasChildren())

जहाँ तक मैं देख सकता हूं, हर रूप में त्रुटियों और बच्चों के रूप में हो सकता है। मैं सिम्फनी फ़ॉर्म घटक के साथ विशेषज्ञ नहीं हूं, लेकिन प्रैक्टिस में आपको फॉर्म की कुछ त्रुटियां नहीं मिलेंगी, जैसे CSRF सुरक्षा त्रुटि या अतिरिक्त फ़ील्ड त्रुटि। मैं इस अलगाव को हटाने का सुझाव देता हूं।

अस्वीकृत परिणाम संरचना का उपयोग करना

कुछ लेखकों ने एक साधारण सरणी के अंदर सभी त्रुटियां डाल करने का सुझाव दिया है। इसलिए फॉर्म के सभी त्रुटि संदेशों और इसके बच्चों की एक ही सरणी में विभिन्न अनुक्रमण रणनीतियों के साथ जोड़ दी जाएगी: नंबर-आधारित अपनी त्रुटियों के लिए और नाम-आधारित बच्चों की त्रुटियों के लिए। मैं फॉर्म के सामान्यीकृत डेटा संरचना का उपयोग करने का सुझाव देता हूं:

 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" 

इस तरह से परिणाम आसानी से बाद में गोलाकार हो सकता है।

मेरा समाधान

तो इस समस्या का मेरा समाधान है:

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

मुझे उम्मीद है कि यह किसी की मदद करेगी

सिमफोन 2.1 के लिए:

यह मेरा अंतिम समाधान कई अन्य समाधानों में शामिल है:

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

SYMFONY 3.1

मैंने त्रुटियों के प्रदर्शन को संभालने के लिए बस एक स्थिर विधि लागू की है

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

मदद करने की उम्मीद है