您是否会与我分享如何在Symfony2中的验证组件中使用闭包的示例?
我使用此代码验证$ prop:
use Symfony\Component\Validator\Constraints as Assert;
class A
{
/**
* @Assert\NotBlank()
* @Assert\Choice(choices = {"value1", "value2"})
*/
private $prop;
}
我想在documentation中使用" callback"选项。我已经搜索了一段时间,但还没有找到任何例子。
答案 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
。