У меня есть несколько сущностей, которые используются в одной форме, которая выходит из абстрактного класса.
Я создал тип формы для каждой сущности, а затем они были встроены в родительскую форму.
Я хотел бы выполнить проверку на основе групп, поэтому 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;
AFAIK вы не можете установить validation_groups
на CollectionType
поле формы (соответственно, вы можете установить его, но оно не имеет никакого эффекта), поэтому вся форма, включая набор подформ в коллекции, всегда проверяется с помощью validation_groups
установить на всю родительскую форму.
Цель validation_groups
разрешить изменение ограничений свойств объекта для разных целей (например, создание новых или редактирование существующих), но не для того, что вы описали выше.
Подумайте, если возможно, использовать ваши текущие Email и Telephono как свойство непосредственно в объекте Staff (или StaffType соответственно) с использованием validation_groups для решения $ elemento должно быть Email elemento один раз и Telephono elemento один раз …
Решение для вашего случая состоит в том, чтобы определить Email и Telephono как разные классы (не унаследованные от AbstractElementoContact) с конкретными ограничениями для каждого из них.
Других решений пока нет …