我试图在我的控制器中填充$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()));
}
}
答案 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(您可能希望在其他控制器中重用它)