Symfony表单验证值在数组中


Symfony form validation value is in array

目前,我正在尝试弄清楚如何处理Symfony2的表单构建器上下文中TextType字段的表单字段验证。

有一个字段应该用两个可能的值之一([电子邮件=全部]、[电子邮件=测试])手动显式填充。它旨在成为一些安全功能,以确保用户绝对知道他接下来要做什么。

我想知道是否有验证约束可用于验证字段的输入值以适应两个已知选项之一。[电子邮件=全部]或[电子邮件=测试]。在简单的PHP中,我会这样做

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

我知道我会构建一个自定义验证约束,但也许这甚至可以用 Symfony 标准约束来解决?

提前感谢!

您可以使用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.',
        )));
    }
}

是的,这是可能的!
应使用回调约束验证或表达式约束。最后一个是最简单和务实的方法。考虑一个名为 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 属性必须有一个 foobar 字,或者某个值(来自 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']即可。