如何在Symfony2中的验证组件中使用闭包?

时间:2011-09-05 20:33:45

标签: validation symfony annotations closures

您是否会与我分享如何在Symfony2中的验证组件中使用闭包的示例?

我使用此代码验证$ prop:

use Symfony\Component\Validator\Constraints as Assert;

class A
{
    /**
     * @Assert\NotBlank()
     * @Assert\Choice(choices = {"value1", "value2"})
     */
    private $prop;
}

我想在documentation中使用" callback"选项。我已经搜索了一段时间,但还没有找到任何例子。

1 个答案:

答案 0 :(得分:3)

为了使用闭包,您必须使用PHP定义验证元数据(而不是YAML,XML或注释)。例如,请查看您链接到的页面上第一个示例的“PHP”选项卡。它使用loadValidatorMetadata

以下是回调集的外观:

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\Choice;

class Author
{
    protected $gender;

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('gender', new Choice(
            'message' => 'Choose a valid gender',
            'callback' => function () {
                return array('male', 'female');
            },
        ));
    }
}

正如您所看到的,它并没有真正起作用。主要问题是静态loadValidatorMetadata方法实际上无法访问外部世界。

如果您坚持使用闭包,则可以创建Symfony\Component\Validator\Mapping\Loader\LoaderInterface的单独实现。但老实说,最简单的方法是使用带有实例方法名称的回调,如示例所示getGenders