我按照文档操作,并且能够在我的许多字段(http://symfony.com/doc/current/validation/custom_constraint.html)上添加自定义约束。
我正在计算CollectionType字段的问题。 我的自定义约束只是检查用户是否没有在字段中点击多个空格(无论如何,约束无关紧要)。
我有一个带有标题和答案的问题表单:
$builder
->add('title', TextType::class)
->add('answers', CollectionType::class, array(
'entry_type' => AnswerType::class,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false
))
我有约束:
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class ContainsText extends Constraint
{
public $message = 'constraint_error';
}
我的约束验证器:
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class ContainsTextValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
// It checks if user didn't had multiple space in field
if (strlen(trim($value)) == 0) {
$this->context->buildViolation($constraint->message)
->addViolation();
}
}
}
在我的实体中:
问题:
use XX\XXBundle\Validator\Constraints as CustomAssert;
class Question
{
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255, unique=true)
* @CustomAssert\ContainsText
*/
private $title;
...
}
答案:
use XX\XXBundle\Validator\Constraints as CustomAssert;
class Answer
{
/**
* @var string
*
* @ORM\Column(name="text", type="string", length=255, unique=true)
* @CustomAssert\ContainsText
*/
private $text;
...
}
在我的表单验证中,如果在问题标题中我点击了很多空格,我的“constraint_error”消息=>表格验证错误一切正常。
但是,如果在问题答案文本中我点击了很多空格,表单验证不会返回任何错误,我的问题是用空答案创建的!
似乎如果字段来自CollectionType,则忽略自定义断言。
我不明白的是,如果我在答案文本上有一个Assert(如@Assert \ Blank(),而不是自定义),即使我们在CollectionType中,断言也不会被忽略而且我可以验证一个空白答案的表格。
我在这里想念什么? TY
答案 0 :(得分:3)
不确定您使用的是哪个Symfony 2版本,但取决于2.8或更高版本,您有不同的解决方法:
从Const strSheetName As String = "ConfirmedPivot"
Dim wsTest As Worksheet
On Error Resume Next
Set wsTest = ActiveWorkbook.Worksheets(strSheetName)
On Error GoTo 0 'clear EORN
If Not wsTest Is Nothing then
MsgBox "ConfirmedPivot Sheet already exists in this workbook." & _
" If you don't need it, delete it then try the button again" & _
"(New ConfirmedPivot will be created). If you still need it, " & _
" rename it and try the button again.", _
vbOKOnly, "ConfirmedPivot already exists!"
Exit Sub
Else
Worksheets.Add.Name = "ConfirmedPivot"
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
SourceData:= "Recovered_Sheet1!R1C1:R65536C114", _
Version:=xlPivotTableVersion10). _
CreatePivotTable TableDestination:="'ConfirmedPivot'!R1C1", _
TableName:="PivotTable4", DefaultVersion:=xlPivotTableVersion10
End If
开始,我怀疑您可以使用v2.8
,AnswerType::class
已被弃用。相反,您需要在cascade_validation
类成员上应用Valid
约束。像这样:
Question::$answers
您需要指定class Question
{
/**
* ... Other anotaions go here
*
* @Assert\Valid()
*/
private $answers
}
选项:
cascade_validation
希望这会有所帮助......