向 Symfony 2表单元素添加错误

我在控制器中检查了一些验证。并且我希望在失败时为表单的特定元素添加错误。我的表格:

use Symfony\Component\Form\FormError;


// ...


$config = new Config();
$form = $this->createFormBuilder($config)
->add('googleMapKey', 'text', array('label' => 'Google Map key'))
->add('locationRadius', 'text', array('label' => 'Location radius (km)'))
->getForm();


// ...


$form->addError(new FormError('error message'));

AddError ()方法将错误添加到表单中,而不是添加到元素中。如何向 locationRadius 元素添加错误?

72880 次浏览

You can do

$form->get('locationRadius')->addError(new FormError('error message'));

As form elements are also of FormInterface type.

OK guys, I have another way. It is more complex and only for specific cases.

My case:

I have a form and after submit I post data to the API server. And errors I got from the API server as well.

API server error format is:

array(
'message' => 'Invalid postal code',
'propertyPath' => 'businessAdress.postalCode',
)

My goal is to get flexible solution. Lets set the error for the corresponding field.

$vm = new ViolationMapper();


// Format should be: children[businessAddress].children[postalCode]
$error['propertyPath'] = 'children['. str_replace('.', '].children[', $error['propertyPath']) .']';


// Convert error to violation.
$constraint = new ConstraintViolation(
$error['message'], $error['message'], array(), '', $error['propertyPath'], null
);


$vm->mapViolation($constraint, $form);

That's it!

NOTE! addError() method bypasses error_mapping option.


My form (Address form embedded in the Company form):

Company

<?php


namespace Acme\DemoBundle\Form;


use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints;


class Company extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('companyName', 'text',
array(
'label' => 'Company name',
'constraints' => array(
new Constraints\NotBlank()
),
)
)
->add('businessAddress', new Address(),
array(
'label' => 'Business address',
)
)
->add('update', 'submit', array(
'label' => 'Update',
)
)
;
}


public function getName()
{
return null;
}
}

Address

<?php


namespace Acme\DemoBundle\Form;


use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints;


class Address extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// ...
->add('postalCode', 'text',
array(
'label' => 'Postal code',
'constraints' => array(
new Constraints\NotBlank()
),
)
)
->add('town', 'text',
array(
'label' => 'Town',
'constraints' => array(
new Constraints\NotBlank()
),
)
)
->add('country', 'choice',
array(
'label' => 'Country',
'choices' => $this->getCountries(),
'empty_value' => 'Select...',
'constraints' => array(
new Constraints\NotBlank()
),
)
)
;
}


public function getName()
{
return null;
}
}