จากคำตอบของ @Jay Seth ฉันได้สร้างคลาส FormErrors โดยเฉพาะสำหรับ Ajax Forms:
// 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
setDefaults