Проверка встроенной формы Symfony

У меня есть несколько сущностей, которые используются в одной форме, которая выходит из абстрактного класса.
Я создал тип формы для каждой сущности, а затем они были встроены в родительскую форму.

Я хотел бы выполнить проверку на основе групп, поэтому EmailType должен проверять свойство «elemento» только для Assert \ NotBlank (группа по умолчанию) и Assert \ Email (группа электронной почты), а Telefono должен проверять Assert \ NotBlank (группа по умолчанию) и Assert \ Regex (телефонная группа).

С моей конфигурацией выполняются обе проверки (ограничения), поэтому электронная почта проверяется на ограничение электронной почты И регулярное выражение, и поэтому телефон подал … Где я ошибаюсь?

Сотрудники электронной почты и телефоны сотрудников отдела настроили ограничение Assert \ Valid ()

Это пример

Родительская форма

<?php
namespace App\Form\Staff;

class StaffType extends AbstractType {

public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(['data_class' => \Cowbell\Entity\Staff\Staff::class,
'validation_groups' => ['Default', 'email', 'phone']]);
}
/**
*
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options) {// ... Other field of Staff Entity

->add('emails', CollectionType::class, ['label' => 'admin.emails',
'entry_type' => \App\Form\Contatto\CBEmailType::class,
'entry_options' => ['label' => false],
'allow_add' => true,
'allow_delete' => true,
'empty_data' => null,
'translation_domain' => 'admin',
'validation_groups' => ['email']])
->add('telefoni', CollectionType::class, ['label' => 'admin.phones',
'entry_type' => \App\Form\Contatto\CBTelefonoType::class,
'entry_options' => ['label' => false],
'allow_add' => true,
'allow_delete' => true,
'empty_data' => null,
'translation_domain' => 'admin',
'validation_groups' => ['phone']]);

}

}

Тогда CBEmailType

<?php
namespace App\Form\Contatto;

class CBEmailType extends AbstractType{

/**
*
* @param OptionsResolver $resolver
*/
public function configureOptions( OptionsResolver $resolver)
{
$resolver->setDefaults(['data_class' => \App\Entity\Contatto\Email::class,
'validation_groups' => ['Default', 'email']]);;
}

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

$builder->add('elemento', EmailType::class, ['label' => 'admin.email',
'translation_domain' => 'admin'])

}

}

CBTelefonoType

<?php
namespace App\Form\Contatto;

class CBTelefonoType extends AbstractType{

/**
*
* @param OptionsResolver $resolver
*/
public function configureOptions( OptionsResolver $resolver)
{
$resolver->setDefaults(['data_class' => \Cowbell\Entity\Contatto\Telefono::class,
'validation_groups' => ['Default', 'phone']]);
}

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

$builder->add('elemento', TextType::class, ['label' => 'admin.phone',
'translation_domain' => 'admin'])

}

}

Оба, электронная почта и Telefono расширяются

<?php
namespace App\Entity\Contact;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

abstract class AbstractElementoContact {/**
*
* @var string
*
* @ORM\Column(name="elemento", type="string", length=100, nullable=false)
* @Assert\NotBlank()
* @Assert\Email(strict=true, checkHost=true, checkMX=true, groups={"email"})
* @Assert\Regex("/[0-9]{6,50}/", groups={"phone"})
*/
protected $elemento;

1

Решение

AFAIK вы не можете установить validation_groups на CollectionType поле формы (соответственно, вы можете установить его, но оно не имеет никакого эффекта), поэтому вся форма, включая набор подформ в коллекции, всегда проверяется с помощью validation_groups установить на всю родительскую форму.

Цель validation_groups разрешить изменение ограничений свойств объекта для разных целей (например, создание новых или редактирование существующих), но не для того, что вы описали выше.
Подумайте, если возможно, использовать ваши текущие Email и Telephono как свойство непосредственно в объекте Staff (или StaffType соответственно) с использованием validation_groups для решения $ elemento должно быть Email elemento один раз и Telephono elemento один раз …

Решение для вашего случая состоит в том, чтобы определить Email и Telephono как разные классы (не унаследованные от AbstractElementoContact) с конкретными ограничениями для каждого из них.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]