我喜歡它的一種形式:使用表達式constrainst非對象
class FeatureDynamicSequenceType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('upstream', IntegerType::class, [
'data' => 0,
'constraints' => [
new LessThan([
'value' => 1000,
]),
],
])
->add('downstream', IntegerType::class, [
'data' => 0,
'constraints' => [
new LessThan([
'value' => 1000,
]),
],
])
->add('showUtr', CheckboxType::class,[
'data' => true,
'label' => 'Show UTR',
'required' => false,
])
->add('showIntron', CheckboxType::class,[
'data' => true,
'required' => false,
])
;
}
}
在這種形式下,我想添加一個Constrainst,辦理入住手續: 如果showUtr或ShowIntron不會被檢查,然後上游和downstreal能「T是> 0
然後,我想是這樣的:
->add('upstream', IntegerType::class, [
'data' => 0,
'constraints' => [
new LessThan([
'value' => 1000,
]),
new Expression([
'expression' => 'value > 0 && (this.showUtr || this.showIntron)',
'message' => 'You cannot set upstream if you do not display UTRs and introns.',
]),
],
])
但我不能使用它,因爲它不是一個對象,值給我的上游字段的值(這是確定),但我不能訪問到showUtr或showIntron值...
編輯:嘗試回調封閉
->add('upstream', IntegerType::class, [
'data' => 0,
'constraints' => [
new LessThan([
'value' => 1000,
]),
new Callback([
'callback' => function($data, ExecutionContextInterface $executionContectInterface) {
dump($data);
$executionContectInterface->addViolation('You cannot set upstream if you do not display UTRs and introns.');
},
])
],
])
我有同樣的問題,$數據只包含字段值。
我真的不想創建一個實體,因爲我不堅持它......而且我不相信沒有一個解決方案來檢查它,而不會創建一個實體。
我已經回調至試過,但問題是完全一樣的。 – mpiot
您必須在configureOptions方法中使用'$ resolver-> setDefaults(['constraints'=> ...])''中的回調約束 –
是的,如果我將測試放在configureOptions中,我可以訪問整個數據,然後在這個地方我已經嘗試了表達式和回調工作。不同之處在於,在Callback中,我可以在該字段上顯示錯誤。在表達式中,我有一個通用的表單錯誤。 – mpiot