Symfony 3 | CollectionType实体

时间:2016-10-17 15:27:15

标签: forms symfony collections constraints custom-validators

我按照文档操作,并且能够在我的许多字段(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

1 个答案:

答案 0 :(得分:3)

不确定您使用的是哪个Symfony 2版本,但取决于2.8或更高版本,您有不同的解决方法:

v2.8 +和v3.0 +

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.8AnswerType::class已被弃用。相反,您需要在cascade_validation类成员上应用Valid约束。像这样:

Question::$answers

Pre v2.8:

您需要指定class Question { /** * ... Other anotaions go here * * @Assert\Valid() */ private $answers } 选项:

cascade_validation

希望这会有所帮助......