2016-03-04 50 views
0

目前我正在试图找出如何处理TextType场的表单字段验证在Symfony2中的表单生成器上下文。Symfony的表单验证值是数组

有应该明确地与两个可能值中的一个手动填充的字段([电子邮件=所有],[电子邮件=试验])。它旨在成为一些安全功能,以确保用户明确知道他下一步在做什么。

我不知道是否有可用于验证字段的输入值,以适应的两个已知选项之一验证约束。可以[email = all]或[email = test]。在纯PHP,我会做像这样

function isValid($value){ 
    $options = array("[email=all]","[email=test]"); 
    return (in_array($value, $options)) ? true : false; 
} 

我知道,我要建立一个自定义的验证约束,但也许这可能甚至Symfony的标准约束来解决?

在此先感谢!

回答

3

可以使用Choice约束。

一个例子:

// src/AppBundle/EntityAuthor.php 
namespace AppBundle\Entity; 

use Symfony\Component\Validator\Mapping\ClassMetadata; 
use Symfony\Component\Validator\Constraints as Assert; 

class Author 
{ 
    protected $gender; 

    public static function loadValidatorMetadata(ClassMetadata $metadata) 
    { 
     $metadata->addPropertyConstraint('gender', new Assert\Choice(array(
      'choices' => array('male', 'female'), 
      'message' => 'Choose a valid gender.', 
     ))); 
    } 
} 
+0

感谢您的回答。这正是我期待的!亲切的问候! – barbieswimcrew

1

是的,这是可能的!
您应该使用Callback constraint验证或Expression constraint。最后是最简单实用的方法。 考虑一个实体,称为Task

<?php 

namespace AppBundle\Entity; 

class Task 
{ 
    protected $id; 
    protected $title; 

    public function setTitle($title) 
    { 
     $this->title = $title; 

     return $this; 
    } 
    public function getTitle() 
    { 
     return $this->title; 
    } 

    //... 
} 

现在我们假设title属性必须有一个酒吧字,或者一些值(title属性)是否在定义的数组:

# src/AppBundle/Resources/config/validation.yml 
    AppBundle\Entity\Task: 
     properties: 
      title: 
       - Expression: 
        expression: "this.getTitle() in ['foo', 'bar']", 
        message: "Title must be 'foo' or 'bar'!" 
       - NotBlank: ~ 

因此,在特定情况下,仅仅通过['[email=all]', '[email=test]']交换['foo', 'bar']或任何你想要的。

+0

感谢您的帮助。我不是对实体本身进行验证的朋友(不管是否通过yml或注释)。有没有办法将它直接设置为表单构建器类中的约束? – barbieswimcrew