Określ różne grupy walidacyjne dla każdego elementu kolekcji w Symfony 2?

[Dokumentacja dotycząca kolekcji] W przypadku osadzania formularzy (typ kolekcji) można określić grupy walidacji dla każdego elementu na podstawie bieżącego elementu? Wydaje się, że nie działa bankomat.

TheTaskType formularz dodawania kolekcji tagów:

// src/Acme/TaskBundle/Form/Type/TaskType.php

// ...
public function buildForm(FormBuilderInterface $builder, array $options)
{
    // ...

    $builder->add('tags', 'collection', array(
        // ...
        'by_reference' => false,
    ));
}

Na przykład mamy dwa znaczniki (znacznik 1 i znacznik 2), a nowy znacznik jest dodawany za pomocą przycisku „Dodaj” (poprzez JavaScript):

-----------
| add tag |
-----------
- tag 1 (existing)
- tag 2 (added clicking the "add tag" button)

Tag 1 powinien być zatwierdzony przeciwkoDefault, Edit grupy, podczas gdy tag 2 przeciwkoDefault tylko grupa.

TagType formularz definiujący dynamiczne grupy walidacyjne

W oparciu o dane bazowe, jeśli tag jest nowy, dostajeDefault grupa, jeśli istniejeDefault, Create grupy:

// ...

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'validation_groups' => function (FormInterface $form) {
            $tag = $form->getData();

            $groups = array('Default');
            if (null !== $tag && null !== $tag->getId()) {
                $groups[] = 'Edit';
            }

            return $groups;
        }
    ));
}

// ...
Tag encja z ograniczeniem w grupie „Edytuj”

Przykład zTag definiowanie dwóch właściwości (pominięto akcesory):

class Tag
{
    /**
     * @Assert\NotBlank()
     */
    protected $name;

    /**
     * @Assert\NotBlank(groups={"Edit"})
     * @Assert\Length(max="255")
     */
    protected $description;

    // ...
}

Naistniejący tag: opis nie powinien być pusty. Dlanowy tag: opis może być pusty.

Formularz dowodowy jest ważny, walidator pokazuje błędy (błędne!)

Po prostu edytuj istniejący tag i pozostaw pusty opis. Theformularz potwierdza aleUsługa sprawdzania poprawności pokazuje błędy:

$form = $this->createForm('task', $task)
    ->handleRequest($request);

$validator = $this->get('validator');

if ($form->isValid()) {
    foreach ($task->getTags() as $tag) {
        // Validate against Default, Edit groups
        $errors = $validator->validate($tag, array('Default', 'Edit'));

        if (null !== $tag && null !== $tag->getId()) {
            echo 'Existing tag #'.$tag->getId();
        } else {
            echo 'New tag';
        }

        echo ', errors: '.count($errors).'<br>';
    }

    die('Form is valid.')

    // ...
}

Wydajność:

Existing tag #863, errors: 1
Form is valid.

Aktualizacja 1: Próbowałem (bez powodzenia) metodą statycznądetermineValidationGroups jak sugerowanotutaj:

public static function determineValidationGroups(FormInterface $form)
{
    $groups =  array('Default');
    if ($form->getData() !== null && null !== $form->getData()->getId())
    {
        $groups =  array('Edit');
    }

    var_dump($groups);

    return $groups;
}

WTagType Formularz:

/**
 * {@inheritdoc}
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        // ... 
        'validation_groups' => array(
            'Acme\TaskBundle\Entity\Tag',
            'determineValidationGroups'
        ),
    ));
}

Wydanie tylko jednego istniejącego tagu i jednego utworzonego przy użyciu linku „dodaj tag” wydaje się prawidłowe. Ale nie ma błędów dla istniejącego znacznika pozostawiając pusty opis:

array (size=1)
  0 => string 'Edit' (length=4)

array (size=1)
  0 => string 'Edit' (length=4)

rray (size=1)
  0 => string 'Default' (length=7)

rray (size=1)
  0 => string 'Default' (length=7)

questionAnswers(1)

yourAnswerToTheQuestion