处理控制器中的表单错误并将其传递给twig

时间:2014-07-15 20:24:29

标签: php symfony twig

我试图在我的控制器中填充$errors['field_name'] = 'Error message';,以便我可以将变量传递给twig进行进一步处理。如何通过错误循环并创建自己的数组变量?

我已经检查并应用了这些,但没有得到确切的答案,或者我错过了。

FORM TYPE

->add('name', 'text', array('label' => 'Name', 'error_bubbling' => true))
->add('origin', 'text', array('label' => 'Origin', 'error_bubbling' => true))

TWIG

{% if errors is defined %}
    <ul>
    {% for field, message in errors %}
        <li>{{ field ~ ':' ~ message }}</li>
    {% endfor %}
    </ul>
{% endif %}

CONTROLLER

public function submitAction(Request $request)
{
    $form = $this->createForm(new BrandsType(), new Brands());
    $form->handleRequest($request);

    if ($form->isValid() !== true)
    {
        $errors['field_name'] = 'Error message';

        return $this->render('CarBrandBundle:brands.html.twig',
                array('errors' => $errors, 'form' => $form->createView()));
    }
}

1 个答案:

答案 0 :(得分:1)

尝试这样的方法:

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

    //this part get global form errors (like csrf token error)
    foreach ($form->getErrors() as $error) {
        $errors[] = $error->getMessage();
    }

    //this part get errors for form fields
    /** @var Form $child */
    foreach ($form->all() as $child) {
        if (!$child->isValid()) {
            $options = $child->getConfig()->getOptions();
            //there can be more than one field error, that's why implode is here
            $errors[$options['label'] ? $options['label'] : ucwords($child->getName())] = implode('; ', $this->getErrorMessages($child));
        }
    }

    return $errors;
}

此方法将返回您想要的内容,即带有表单错误的关联数组。

它的使用将在你的情况下(控制器):

if ($form->isValid() !== true)
{
    $errors = $this->getErrorMessages($form);

    return $this->render('CarBrandBundle:brands.html.twig',
            array('errors' => $errors, 'form' => $form->createView()));
}

此用法假设您的控制器中有getErrorMessages方法,但更好的想法是使用此方法创建一些类并registering it as a service(您可能希望在其他控制器中重用它)