많은 이미지가있는 프로젝트 엔티티가 있습니다. 모든 이미지의 제목은 imageFile입니다.Symfony 3에서 컬렉션의 각 항목에 대해 다른 검증 그룹을 지정 하시겠습니까?
사용자가 프로젝트 양식에서 이미지를 추가, 업데이트 및 삭제할 수 있기를 바랍니다.
문제는 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';
}
}
당신은 내가 유효성 검사 그룹 "newImage"을 추가하고있어 ProjectImageType에서 볼 수있다 이미지가 새롭거나 사용자가 새 이미지를 추가하려는 경우이 경우 im 나이 파일이 필요하며 사용자가 이미지 제목 만 업데이트하려는 경우에는 필요하지 않아야합니다.
ProjectImageType에 추가 할 검증 그룹 "newImage"는 항상 무시됩니다.
는 여기 Specify different validation groups for each item of a collection in Symfony 2? 을 제공하는 솔루션을 시도했지만 문제는 심포니에서 제거 cascade_validation 옵션 3여기서 문제는 서로 또한 다른에서 다른 유효성 검사 그룹에 대한 모든 컬렉션 타입의 실체를 확인할 수 할 수있는 방법이라는 것이다 상위 폼 형식 유효성 검사 그룹에서?
ProjectImage 법인
/**
* 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();
}
}
: