Укажите разные группы проверки для каждого элемента коллекции в Symfony 3?
У меня есть объект проекта, который имеет много изображений, каждое изображение имеет заголовок, атрибуты imageFile
Я хочу, чтобы пользователь мог добавлять, обновлять и удалять изображения из формы проекта.
Проблема в том, что группы проверки сущности projectImage, когда они новые, должны отличаться от того, когда они редактируются.
и это код
ProjectType
class ProjectType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->addEventSubscriber(new \ControlPanelBundle\Form\EventListener\CityFieldSubscriber())
->addEventSubscriber(new \ControlPanelBundle\Form\EventListener\CountryFieldSubscriber());
$builder
->add('title')
->add('description')
->add('area')
->add('startDate')
->add('deliveryDate')
->add('phases')
->add('partners', EntityType::class, [
'class' => 'AppBundle:Partner',
'multiple' => true,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('p')
->orderBy('p.title', 'ASC');
}
])
->add('projectImages', CollectionType::class, [
'entry_type' => ProjectImageType::class,
'allow_add' => true,
'allow_delete' => true,
'delete_empty' => true,
'by_reference' => false,
'error_bubbling' => false
]);
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Project'
));
}
/**
* @return string
*/
public function getName()
{
return 'project';
}
}
ProjectImageType
class ProjectImageType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('id', HiddenType::class)
->add('title', TextType::class)
->add('type', ChoiceType::class, ['choices' => array_flip(\AppBundle\Entity\ProjectImage::getTypeChoices())])
->add('imageFile', FileType::class);
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'AppBundle\Entity\ProjectImage',
'validation_groups' => function(\Symfony\Component\Form\FormInterface $form) {
$validationGroups = ['Default'];
if ($form->getData() === null || null === $form->getData()->getId()) {
$validationGroups[] = "newImage";
}
return $validationGroups;
}
]);
}
public function getName()
{
return 'project_image';
}
}
как вы можете видеть в ProjectImageType, я добавляю группу проверки "newImage", если изображение новое или если пользователь хочет добавить новое изображение, в этом случае требуется только файл изображения и не требуется, если пользователь хочу просто обновить заголовок изображения.
проблема в том, что группа проверки "newImage", которую я добавляю в ProjectImageType, всегда игнорируется.
Я пробовал решение, приведенное здесь. Укажите разные группы проверки для каждого элемента коллекции в Symfony 2? но проблема в том, что опция cascade_validation удалена из Symfony 3
вопрос здесь в том, как можно проверить каждую сущность типа коллекции по разным группам проверки друг от друга, а также отличаться от родительских групп проверки типа формы?
1 ответ
Я решил проблему, не используя группы проверки, добавив проверку обратного вызова в объект проекта следующим образом:
ProjectImage Entity
/**
* assert that image not blank only if new object
*
* @Assert\Callback
*/
public function validateImage(ExecutionContextInterface $context) {
if (null === $this->id && null === $this->getImageFile()) {
$context->buildViolation('Image is required')
->atPath('imageFile')
->addViolation();
}
}