Closed
Description
See example of embedded form.
class Item
{
public $title;
}
class Foo implements \IteratorAggregate
{
public $items;
public function __construct()
{
$this->items = [new Item()];
}
public function getIterator()
{
return new \ArrayIterator([
'items' => $this->items
]);
}
}
class ItemType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('title', 'text');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults([
'data_class' => __NAMESPACE__ . '\Item',
'error_bubbling' => false
]);
}
public function getName()
{
return 'item';
}
}
class FooType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('items', 'collection', [
'type' => new ItemType()
]);
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults([
'data_class' => __NAMESPACE__ . '\Foo',
'error_bubbling' => false
]);
}
public function getName()
{
return 'foo';
}
}
Resources/config/validation.yml:
Foo\Item:
properties:
title:
- NotBlank:
message: XXX
Now when I call this
$form = $this->get('form.factory')
->createNamed('form', new FooType(), new Foo(), [
'csrf_protection' => false,
'error_bubbling' => false
]);
;
$form->submit([]);
var_dump($form->getErrors());
Error from items[0].title bubbles to the root of the form
array(1) {
[0]=>
object(Symfony\Component\Form\FormError)#534 (4) {
["message":"Symfony\Component\Form\FormError":private]=>
string(3) "XXX"
["messageTemplate":protected]=>
string(3) "XXX"
["messageParameters":protected]=>
array(0) {
}
["messagePluralization":protected]=>
NULL
}
}