2015-02-09 67 views
2

我有兩個有關驗證的問題。我在我的實體中使用了很多屬性方法(getter)(更好的代碼imho)。這是一個這樣的實體:驗證基於getter而不是屬性的symfony集合

class Spec2Events implements ValueAssignable 
    { 
     private $values; 

     /** 
     * @return \Doctrine\Common\Collections\Collection 
     */ 
     public function getValues() 
     { 
      return $this->values; 
     } 

     /** 
     * @return \Doctrine\Common\Collections\Collection 
     */ 
     public function getCauseOfDeathValues() 
     { 
      $codPms=array(); 
      array_push($codPms,'Cause of death::Natural'); 
      array_push($codPms,'Cause of death::Bycatch'); 
      array_push($codPms,'Cause of death::Ship strike'); 
      array_push($codPms,'Cause of death::Predation'); 
      array_push($codPms,'Cause of death::Other'); 
      array_push($codPms,'Cause of death::Unknown'); 
      return $this->getValues()->filter(
       function($entry) use ($codPms) { 
        return in_array($entry->getPmdSeqno()->getName(), $codPms); 
       } 
      ); 
     } 
    } 

在這種情況下$ values是一個SpecimenValues(實現EntityValues)的集合。 ValueAssignables有一個EntityValues集合。

EntityValuesType類是任何實現EntityValues的類的表單。這個表格有一些文字或選擇的孩子。

EntityValuesType形式被稱爲像這樣:

$builder->add('causeOfDeathValues', 'collection', array('type' => new EntityValuesType($this->doctrine), 
    'options' => array('data_class' => 'AppBundle\Entity\SpecimenValues'), 
    'allow_delete' => true, 
    'delete_empty' => true 
)); //in order to check if using a class getter as a property works (fails) 
$builder->add('values', 'collection', array('type' => new EntityValuesType($this->doctrine), 
    'options' => array('data_class' => 'AppBundle\Entity\SpecimenValues'), 
    'allow_delete' => true, 
    'delete_empty' => true 
)); //in order to check if using a class member as a property works (works) 

Validation.yml爲SpecimenValues看起來是這樣的:

AppBundle\Entity\SpecimenValues: 
    properties: 
     pmdSeqno: 
       - NotBlank: ~ 
       - NotNull: ~ 
     s2eScnSeqno: 
       - NotBlank: ~ 
       - NotNull: ~ 
     description: 
       - Length: 
        min: 0 
        max: 250 
     value: 
       - NotBlank: ~ 
       - NotNull: ~ 
       - Length: 
        min: 1 
        max: 50 
     valueFlag: 
       - Length: 
        min: 0 
        max: 50 

的控制器是這樣的:

public function newAction() 
    { 
     $observation = $this->prepareObservation(); 
     $form = $this->createForm(new ObservationsType($this->getDoctrine()), $observation); 
     return $this->render('AppBundle:Page:add-observations-specimens.html.twig', array(
      'form' => $form->createView() 
     )); 
    } 

    private function prepareObservation(){ 
     $observation = new Observations(); 
     $event = new EventStates(); 
     $observation->setEseSeqno($event); 

     $s2e = new Spec2Events(); 
     $event->setSpec2Events($s2e); 

     $this->instantiateSpecimenValues('Cause of death::Natural', $s2e, false); 
     $this->instantiateSpecimenValues('Cause of death::Bycatch', $s2e, false); 
     $this->instantiateSpecimenValues('Cause of death::Ship strike', $s2e, false); 
     $this->instantiateSpecimenValues('Cause of death::Predation', $s2e, false); 
     $this->instantiateSpecimenValues('Cause of death::Other', $s2e, false); 
     $this->instantiateSpecimenValues('Cause of death::Unknown', $s2e, false); 
//... 
     return $observation; 
    } 

    private function instantiateSpecimenValues($pmName, &$s2e, $mustBeFlagged) 
    { 
     $em = $this->getDoctrine()->getManager(); 
     $pm = $em->getRepository("AppBundle:ParameterMethods")->getParameterMethodByName($pmName); 
     $sv = new SpecimenValues(); 
     $sv->setPmdSeqno($pm); 
     $sv->setS2eScnSeqno($s2e); 
     $sv->setValueFlagRequired($mustBeFlagged); 
     return $sv; 
    } 

現在,我的問題在於空值不會被驗證器阻止(不會顯示任何表單錯誤消息)。

如果我編程方式添加驗證限制在FormEvents :: PRE_SET_DATA,像這樣:

$options2['constraints'] = array(new \Symfony\Component\Validator\Constraints\NotNull()); 

它的工作原理,但擺在.yml文件的限制被忽略。是否有可能結合做'編程'和validation.yml?無論如何,我會寫一個回調來添加.yml,所以我更喜歡validation.yml。

使用名稱爲'values'的窗體子對應於純類成員變量,其工作方式如下:所有必需的空字段都會獲得一條消息。所有其他驗證正常工作。

什麼可以解決這個問題?我也可以使用「值」並使用樹枝來分割集合,但我更喜歡使用方法作爲屬性訪問器。

謝謝!

+0

是否還有其他的驗證工作?您還可以在yware獲取表單值時分享您的操作 – Baig 2015-02-09 14:51:41

+0

其他不相關的驗證工作。 「價值」收集表單的驗證也可以。 – 2015-02-09 15:32:21

回答

0

我已經解決了這個問題,只需創建字段既作爲getters和作爲屬性。屬性本身在setters中設置。這是必要的,否則驗證器從不被調用。

所以:

/** 
* @var \Doctrine\Common\Collections\Collection 
* @ORM\OneToMany(targetEntity="AppBundle\Entity\SpecimenValues", mappedBy="s2eScnSeqno") 
*/ 
private $values; 

private $causeOfDeathValues; 

/** 
* @param \Doctrine\Common\Collections\Collection $values 
* @return Spec2Events 
*/ 
public function setCauseOfDeathValues(\Doctrine\Common\Collections\Collection $values) 
{ 
    $this->causeOfDeathValues=$values; 
    $this->values= new \Doctrine\Common\Collections\ArrayCollection(
     array_merge($this->getValues()->toArray(), $values->toArray()) 
    ); 
    return $this; 
} 
相關問題