Symfony2: ফর্মটি অনুরোধ সীমাবদ্ধ করার পরে কিভাবে ফর্ম বৈধতা ত্রুটি পেতে


110

এখানে আমার 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?

উত্তর:


117

এটি করার দুটি উপায় আপনার কাছে রয়েছে:

  • ব্যবহারকারীকে ত্রুটি ও পুনর্নির্দেশ {{ form_errors(form) }}টেম্পলেট ফাইলের মধ্যে করবেন না
  • হিসাবে অ্যাক্সেস ত্রুটি অ্যারে $form->getErrors()

22
আপনার প্রস্তাবিত দ্বিতীয় কাজটি আমি করেছিলাম তবে ফর্ম-> getErferences () একটি ফাঁকা অ্যারে ফিরিয়ে দেয়।
putolaruan

2
আমি প্রথমটিও করেছি (ডাব্লু / পিএইচপি টেম্পলেটগুলি <? পিএইচপি ইকো $ দেখুন ['ফর্ম'] -> ত্রুটিগুলি ($ ফর্ম)?>) তবে এটি খালি!
পুতলারান

59
@ মাইভগুলি error_bubblingআপনার প্রতিটি ফর্মের জন্য স্পষ্টভাবে বিকল্পটি সেট করে আপনার ফর্মের ধরণে সত্যই সেট করতে হবে ।
কেজিলেডেন

5
আপনি যদি কাস্টম ভ্যালিডিটার ব্যবহার করছেন তবে সাইমফনি valid form-> getErferences () valid ফর্ম- এ এই বৈধদের দ্বারা উত্পন্ন ত্রুটিগুলি ফিরিয়ে দেবে না।
জে শেঠ

13
$form->getErrors(true)শিশু ফর্মগুলির ত্রুটিগুলিও অন্তর্ভুক্ত করতে আপনি করতে পারেন
ক্রিস

103

সিমফনি ২.৩ / ২.৪:

এই ফাংশনটিতে সমস্ত ত্রুটি রয়েছে। "সিএসআরএফ টোকেনের মতো ফর্মটিতে থাকাগুলি অবৈধ Please ফর্মটি পুনরায় জমা দেওয়ার চেষ্টা করুন।" পাশাপাশি ফর্ম শিশুদের অতিরিক্ত ত্রুটিগুলি যার কোনও ত্রুটি বুদবুদ নেই।

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

সিমফনি 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 (at নীচে The method Form::getErrorsAsString() was removed:)


1
এটি বর্তমান সিমফনি ২.৪-এর সবচেয়ে সঠিক উত্তর বলে মনে হচ্ছে।
স্লাভা ফমিন II

@ ফ্লিপ এটি 2.5
iarroyo

1
দুর্দান্ত উত্তর BUT $errors[$child->getName()] = $this->getErrorMessages($child);ব্যতিক্রম ছুঁড়েছিল , কারণ getrrmessages সিমফনি \ বান্ডিল \ ফ্রেমওয়ার্কবান্ডেল \ কন্ট্রোলার \ কন্ট্রোলার উপাদান থেকে অনুপস্থিত ছিল । সুতরাং আমি এটির সাথে প্রতিস্থাপন করেছি$form_errors[$child->getName()] = $child->getErrorsAsString();
আহাদ আলী

3
@ আহাদলি এটি একটি পুনরাবৃত্ত ফাংশন, সুতরাং যখন আপনি কোড স্নিপেটটি ক্লাসে রাখেন যেখানে আপনার এই কার্যকারিতাটি প্রয়োজন সেখানে এটি নিজেই কল করতে সক্ষম হবে। আপনার "ফিক্স" আপনাকে নেস্টেড ফর্মগুলিতে পৌঁছাতে বাধা দেবে। এটি 37 অন্যান্য লোকের জন্য কাজ করেছে, এটি আপনার পক্ষেও কাজ করা উচিত;)
ফ্লিপ করুন

@ ফ্লিপ আহ দুঃখিত আমার খারাপ, আমি কেবল তাকিয়ে ছিলাম $this->getErrorMessages()এবং আমি ভেবেছিলাম এটি সরাসরি একটি নিয়ামক এবং সিমফনি এপিআইয়ের অংশের ভিতরে ডাকা হয়েছিল।
আহাদ আলী

47

নীচে আমার জন্য কাজ করা সমাধানটি দেওয়া হল। এই ফাংশনটি একটি নিয়ামকের মধ্যে রয়েছে এবং সমস্ত ত্রুটি বার্তাগুলির এবং তার কারণের ক্ষেত্রের একটি কাঠামোগত অ্যারে প্রদান করবে।

সিমফনি ২.০:

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

সিমফনি ২.১ এবং আরও নতুন:

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
Gist.github.com/2011671 উন্নত হয়েছে তবে এখনও আমি চাই না। আমি অ্যারে কীগুলি ফিল্ডের নাম হতে চাই, তবে সেগুলি নয়।
আম্পিরস্কি

9
@ সালমানপেকে টুইগের উপরের কোডটিতে কোথাও রেফারেন্স নেই। আমি বিশ্বাস করি না আমি আপনার মন্তব্যটি বুঝতে পেরেছি।
Icode4food

1
পূর্ববর্তী টুকরোটির জন্য এখানে একটি স্থিরতা রয়েছে, এটি সিমফনি ২.১..7 এর অধীনে কাজ করে। gist.github.com/WishCow/5101428
কে নরবার্ট

দেখে মনে হচ্ছে সাইমনফোনি ২.১$this->getFormErrors$this->getErrorMessages
মিক

@ কুমিরস্কি মাঠটির নাম পেতে, আমি এটি পেয়েছি: $ চাইল্ড-> getConfig () -> getOptions () ['লেবেল'] আমাকে চিরকাল ধরে নিয়ে গেলেন ...
jsgoupil

35

নির্দিষ্ট সত্তার জন্য ত্রুটিগুলি পেতে ভ্যালিডেটর ব্যবহার করুন

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

এপিআই রেফারেন্স:


ধন্যবাদ, আমার কী দরকার +1
ফিল প্যাফোর্ড

4
আমি নিশ্চিত নই যে প্রতিটি সত্তাকে আলাদাভাবে বৈধ করার জন্য এটি একটি ভাল পদ্ধতির। আপনার যদি জটিল শ্রেণিবদ্ধ রূপ থাকে? দ্বিতীয় সমস্যাটি হ'ল বৈধতা দুটিবার ঘটে।
স্লাভা ফমিন II

3
@ স্লাভাফমিনআই - "দ্বিতীয় সমস্যাটি হচ্ছে বৈধতা দুটিবার হয়" - ভাল কথা, কিছুই সতেজ হয় না! পরে একই ত্রুটির তালিকা!
বেন্টকোডার

20

যথাযথ (অনুবাদযোগ্য) বার্তাগুলি পেতে, বর্তমানে এসএফ ২..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 , যদি না আপনি দ্বিতীয় যুক্তি ($ চেপ্টা) সুইচ সত্য । (এটি তারপরে একটি ফর্মআরর উদাহরণটি ফিরিয়ে দেবে এবং আপনাকে বর্তমান () পদ্ধতি ব্যতীত সরাসরি 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;
}

)

সর্বাধিক গুরুত্বপূর্ণ বিষয়টি হ'ল ত্রুটিগুলি পাওয়ার জন্য প্রথম যুক্তিটিকে সত্যে সেট করা। দ্বিতীয় আর্গুমেন্ট ($ সমতল) রেখে তার ডিফল্ট মান ( সত্য ) এর কাছে ফর্মআরার উদাহরণগুলি ফিরে আসবে , যখন এটি ফর্মেরররআইটরেটরের উদাহরণগুলি মিথ্যাতে সেট করা হবে।


দুর্দান্ত জিনিস, একই জিনিস ব্যবহার করে।
জৈবিক

তাই না? :) @ কিডবাইনারি
সিডো

একেবারে টকটকে, সাথী:)
ক্ষতিগ্রস্ত জৈব

সর্বোত্তম বিকল্পটি হ'ল: $ ত্রুটিগুলি = অ্যারে_ম্যাপ (ফাংশন ($ আইটেম) {রিটার্ন $ আইটেম-> বর্তমান () -> getMessage ();}, $ প্রচারণা ফর্ম-> getErferences (সত্য, মিথ্যা));
এনরিক কোয়েরো

সিমফনি ২.7 এর ভাল সমাধান
ইয়ান চাবট

16

আমার ফ্ল্যাশ বার্তাগুলির জন্য আমি খুশি ছিলাম $form->getErrorsAsString()

সম্পাদনা করুন (বেনজি_ এক্স 80 থেকে): এসএফ 3 ব্যবহারের জন্য $form->getErrors(true, false);


3
আমি জানি এটি একটি পুরানো উত্তর তবে ভবিষ্যতের রেফারেন্সের জন্য: This method should only be used to help debug a form.( উত্স )
चीजম্যাকফ্লাই

getErferencesAsString () 3.0 এ অবচয় করা হয়েছে, ব্যবহার করুন: $ ফর্ম-> getErferences (সত্য, মিথ্যা);
বেনজি_এক্স 80

15

সিমফনি ২.১ এর জন্য ফাংশন এবং আরও নতুন, কোনও অবহেলিত ফাংশন ছাড়াই:

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

আমি এই পোস্টে একটি নতুন উত্তর পোস্ট করতে যাচ্ছি কিন্তু আপনি মনে হয় আমাকে ঘুষি মারলেন। কেন পদ্ধতি কলগুলি পাওয়া যায় নি তা জানার জন্য আমাকে উত্স কোডটি সন্ধান করতে হয়েছিল।
ডাঃকুনিটল

আমি লক্ষ্য করেছি যে এটি আইটেমগুলি থেকে ত্রুটিগুলি টানছে না যা ভুলতে বুদ্বুদ্বিত হয়েছে তা সত্য হিসাবে সেট করা আছে। SF2.4
কিংহফবি

@ আপনি প্রথম IFবিবৃতিটির উদ্দেশ্য কী ? কেন এটি পারস্পরিক একচেটিয়া? আমি যতদূর দেখতে পাচ্ছি: ফর্মের নিজস্ব ত্রুটি যেমন বাচ্চাগুলিও থাকতে পারে।
স্লাভা ফমিন II

4

অনুবাদিত ফর্ম ত্রুটি বার্তা (Symfony2.1)

আমি এই তথ্যটি খুঁজতে অনেক লড়াই করে যাচ্ছি তাই আমি মনে করি এটি অবশ্যই ফর্ম ত্রুটির অনুবাদে একটি নোট যুক্ত করা উপযুক্ত।

@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 টি ভিন্ন পোস্ট থেকে একত্র করা হয়েছে:


আপনার সংস্করণটি চেষ্টা করে দেখুন এটি চলে গেছে Fatal Error: Call to undefined method Symfony\Component\Form\FormError::getMessagePluralization()। আমি সন্দেহ করছি এটি কেবল সিমফনি ২.১ এর জন্য?
সিজার পিনো

4

SYMFONY 3.X

এখানে প্রদত্ত অন্যান্য এসএফ 3. এক্স পদ্ধতিগুলি আমার পক্ষে কার্যকর হয়নি কারণ আমি ফর্মটিতে খালি তথ্য জমা দিতে পারি (তবে আমার নটনল / নটব্ল্যাঙ্ক সীমাবদ্ধতা রয়েছে)। এক্ষেত্রে ত্রুটির স্ট্রিংটি দেখতে এই রকম হবে:

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

3

সীমাবদ্ধতা লঙ্ঘন পেতে আপনি বৈধকারক পরিষেবাটিও ব্যবহার করতে পারেন:

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

6
এটি ফর্মটি নয় তবে বস্তুকে বৈধতা দেবে। উদাহরণস্বরূপ, সিআরএসএফ টোকেন ত্রুটির কারণ হিসাবে বার্তাটি অন্তর্ভুক্ত করা হত না।
Icode4food

3

অনুবাদিত ফর্ম ত্রুটি বার্তা (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);

সিমফনি 2.5 তে আপনি খুব সহজে সমস্ত ক্ষেত্রের ত্রুটি পেতে পারেন:

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

3

জন্য Symfony 3.2 এবং ব্যবহার এই সর্বোপরি,

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

আপনি প্রতিটি ত্রুটি বর্ণনা পাঠ্যের বিরক্তিকর ' ত্রুটি: ' পাঠ্য থেকে মুক্তি পেতে চাইলে str_replace ব্যবহার করুন ।

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

2

আপনি যদি কাস্টম ভ্যালিডিটার ব্যবহার করছেন তবে সিম্ফনি সেই বৈধকরণকারীদের দ্বারা উত্পন্ন ত্রুটিগুলি ফিরিয়ে দেবে না $form->getErrors()$form->getErrorsAsString()আপনার প্রয়োজনীয় সমস্ত ত্রুটিগুলি ফিরিয়ে দেবে, তবে দুর্ভাগ্যক্রমে এর আউটপুট একটি স্ট্রিং হিসাবে ফর্ম্যাট করা হয়েছে, অ্যারে নয়।

আপনি যে পদ্ধতিটি সমস্ত ত্রুটিগুলি পেতে এসেছেন (সেগুলি কোথা থেকে এসেছিল তা নির্বিশেষে) আপনি যে পদ্ধতিটি ব্যবহার করছেন তা নির্ভর করে আপনি সিমফোনির কোন সংস্করণ ব্যবহার করছেন তার উপর depends

প্রস্তাবিত সমাধানগুলির বেশিরভাগটিতে একটি পুনরাবৃত্ত ফাংশন তৈরি করা জড়িত যা সমস্ত শিশু ফর্মকে স্ক্যান করে এবং প্রাসঙ্গিক ত্রুটিগুলি একটি অ্যারেতে বের করে। সিমফনি ২.৩ এর $form->hasChildren()কার্যকারিতা নেই, তবে এটি রয়েছে $form->all()

এখানে সিমফনি ২.৩ এর সহায়ক সহায়ক শ্রেণি রয়েছে যা আপনি যে কোনও ফর্ম থেকে সমস্ত ত্রুটিগুলি নিষ্কাশন করতে ব্যবহার করতে পারেন। (এটি সিমফোনির গিথুব অ্যাকাউন্টে সম্পর্কিত বাগের টিকিটে ইয়াপ্রোর একটি মন্তব্য থেকে কোডের ভিত্তিতে তৈরি হয়েছে।)

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

}

2

@ জয় শেঠের উত্তরের ভিত্তিতে, আমি বিশেষত আজাক্স ফর্মগুলির জন্য ফর্মএরিগ্রাস ক্লাসের একটি সংস্করণ তৈরি করেছি:

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

সিমফনি সংস্করণ: ২.৮.৪

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তবে পিতামাতার ফর্মের মধ্যে বিকল্পটি যুক্ত করতে ভুলবেন না setDefaults


1

সিমফনি ২.১ এর পরে টুইগ ত্রুটি প্রদর্শনের সাথে ব্যবহার করার জন্য আমি ফর্মেরার যুক্ত করার জন্য ফাংশনটি পরিবর্তন করেছিলাম কেবল সেগুলি পুনরুদ্ধার করার পরিবর্তে, আপনার ত্রুটির উপর আরও নিয়ন্ত্রণ রয়েছে এবং প্রতিটি পৃথক ইনপুটটিতে ত্রুটি_ব্বলিং ব্যবহার করতে হবে না। আপনি যদি নীচে {{form_erferences (ফর্ম) manner the পদ্ধতিতে সেট না করেন তবে ফাঁকা থাকবে:

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

আমি এই সমাধান নিয়ে এসেছি। এটি সর্বশেষতম সিমফনি ২.৪ এর সাথে দৃ works ়ভাবে কাজ করে ।

আমি কিছু ব্যাখ্যা দেওয়ার চেষ্টা করব।

পৃথক যাচাইকারী ব্যবহার করে

আমি মনে করি সত্ত্বাকে বৈধকরণের জন্য পৃথক বৈধতা ব্যবহার করা এবং সীমাবদ্ধতা লঙ্ঘন বার্তা, যেমন অন্যান্য লেখকদের পরামর্শ মতো ফিরিয়ে দেওয়া খারাপ ধারণা।

  1. আপনাকে সমস্ত সত্তা ম্যানুয়ালি বৈধকরণ করতে হবে, বৈধকরণ গ্রুপগুলি ইত্যাদি নির্দিষ্ট করতে হবে ইত্যাদি জটিল শ্রেণিবদ্ধ রূপগুলির সাথে এটি মোটেই ব্যবহারিক নয় এবং দ্রুত হাত থেকে বেরিয়ে আসবে।

  2. এইভাবে আপনি দুবার ফর্মটি যাচাই করবেন: একবার ফর্মের সাথে এবং একবার পৃথক ভ্যালিডিটারের সাথে। পারফরম্যান্সের দিক থেকে এটি একটি খারাপ ধারণা a

আমি ত্রুটি বার্তা সংগ্রহ করতে বাচ্চাদের সাথে ফর্ম ধরণের পুনরাবৃত্তভাবে পুনরাবৃত্তি করার পরামর্শ দিই।

একচেটিয়া আইএফ স্টেটমেন্ট সহ কিছু প্রস্তাবিত পদ্ধতি ব্যবহার করা

অন্য লেখকদের দ্বারা প্রস্তাবিত কিছু উত্তরের মধ্যে পারস্পরিক একচেটিয়া আইএফ বিবৃতি রয়েছে: if ($form->count() > 0)বা if ($form->hasChildren())

আমি যতদূর দেখতে পাচ্ছি, প্রতিটি ফর্মের বাচ্চাদের পাশাপাশি ত্রুটি থাকতে পারে। আমি সিমফনি ফর্ম উপাদানগুলির সাথে বিশেষজ্ঞ নই , তবে অনুশীলনে আপনি ফর্মের কিছু ত্রুটি নিজেই পাবেন না, যেমন সিএসআরএফ সুরক্ষা ত্রুটি বা অতিরিক্ত ক্ষেত্রের ত্রুটি। আমি এই বিচ্ছেদ অপসারণ করার পরামর্শ দিচ্ছি।

অস্বীকৃত ফলাফল কাঠামো ব্যবহার করে

কিছু লেখক সমস্ত ত্রুটি একটি সরল অ্যারের ভিতরে রাখার পরামর্শ দেন। সুতরাং ফর্মটি এবং এর শিশুদের সমস্ত ত্রুটি বার্তাগুলি বিভিন্ন সূচি কৌশলগুলির সাথে একই অ্যারেতে যুক্ত করা হবে: টাইপের নিজস্ব ত্রুটির জন্য সংখ্যা ভিত্তিক এবং বাচ্চাদের ত্রুটির জন্য নাম ভিত্তিক। আমি ফর্মটির স্বাভাবিকীকরণ করা ডেটা স্ট্রাকচার ব্যবহার করার পরামর্শ দিচ্ছি:

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

আমি আশা করি এটি কাউকে সাহায্য করবে।


@ ওয়েভারিয়ান আপনি কি আমার সমাধানটি একবার দেখে নিতে পারেন? এটি বৈধ, বা কোনও ত্রুটি বা কোনও ভুল ধারণা রয়েছে? ধন্যবাদ!
স্লাভা ফমিন দ্বিতীয়

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

সাহায্য প্রত্যাশী


1

সিমফনি 3 এবং আরও নতুন

আমি সম্প্রতি একটি ফাংশন তৈরি করেছি যা ফর্ম ত্রুটির গাছ তৈরি করে। এটি ফ্রন্ট-এন্ডে ফিরে ত্রুটির তালিকা ফিরিয়ে আনতে সহায়ক হবে। এটি ফর্মের ধরণের উপর ভিত্তি করে:

'error_bubbling' => false

কোড:

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

আউটপুট:

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

        )

)

বিজ্ঞপ্তি : আমি জানি যে উচ্চ স্তরের ত্রুটি থাকলে গভীর স্তরের ক্ষেত্রগুলি থেকে ত্রুটিগুলি ওভাররাইট করা যেতে পারে, তবে এটি আমার ব্যবহারের উদ্দেশ্যে।


Var_dump জন্য উপযুক্ত, ধন্যবাদ
রিপারসন

0

সিমফনি ২.১ এর জন্য:

এটি আমার চূড়ান্ত সমাধান যা অন্য অনেকগুলি সমাধানকে একত্রিত করে:

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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.