我有兩個有關驗證的問題。我在我的實體中使用了很多屬性方法(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'的窗體子對應於純類成員變量,其工作方式如下:所有必需的空字段都會獲得一條消息。所有其他驗證正常工作。
什麼可以解決這個問題?我也可以使用「值」並使用樹枝來分割集合,但我更喜歡使用方法作爲屬性訪問器。
謝謝!
是否還有其他的驗證工作?您還可以在yware獲取表單值時分享您的操作 – Baig 2015-02-09 14:51:41
其他不相關的驗證工作。 「價值」收集表單的驗證也可以。 – 2015-02-09 15:32:21