2017-10-13 3 views
1

많은 이미지가있는 프로젝트 엔티티가 있습니다. 모든 이미지의 제목은 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(); 
    } 
} 
:

답변

3

나는 다음과 같은 프로젝트 개체에 콜백 유효성 검사를 추가하여 유효성 검사 그룹을 사용하지 않고 문제를 해결