添加错误到Symfony 2表单元素

我在我的控制器中检查一些validation。 而我想添加错误到我的表单失败的特定元素。 我的表单:

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元素添加一个错误?

你可以做

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

由于表单元素也是FormInterfacetypes的。

好的,我有另一种方法。 这是更复杂的,只为特定的情况。

我的情况:

我有一个表格,提交后我发布数据到API服务器。 还有我从API服务器获得的错误。

API服务器的错误格式是:

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

我的目标是获得灵活的解决scheme。 让我们为相应的字段设置错误。

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

而已!

注意! addError()方法绕过error_mapping选项。


我的表格(地址表格embedded公司表格):

公司

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

地址

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