我正在处理一个受FOSRestBundle ParamFetcher启发的请求ParamFetcher。
ParamFetcher用于在Controller操作中验证和从请求主体中检索参数。
每个参数可以有一个或多个要求,可以是正则表达式或另一个约束(例如“电子邮件约束。)。
为了验证其中之一,我使用以下内容:
// ...
$paramKey = 'email';
$paramValue = $this->getRequest()->request->get($paramKey);
$constraint = new Email();
$errors = $this->get('validator')->validate($paramValue, $constraint);
// if 0 !== count($errors) then throws an exception
如何在UniqueEntity约束中使用相同的行为?
我不(也不能)使用任何执行断言的FormType,约束的默认用法是将其映射到相应实体中的相应字段,但该字段需要直接从动作中动态设置。
也许可以将实体命名空间作为第二个参数传递给约束,以便使用EntityManager::findOneBy([$para Key=
UniqueEntity是一个类约束,它意味着valdit
方法接收一个对象作为第一个参数。像这样:
$this->get('validator')->validate($obj, new UniqueEntity(FIELD));
如果您的验证逻辑很复杂,您还可以按照此处所述创建自己的验证约束。
最后,我使用以下方法来实现这一点:
$param = new RequestParam('email', 'AcmeBundle\FooEntity', array('unique' => true));
// prototype: RequestParam::__construct($field, $class, array $requirements);
if (true === $params->requirements['unique']) {
$object = new $config->class;
$accessor = PropertyAccess::createPropertyAccessor();
if ($accessor->isWritable($object, $name)) {
$accessor->setValue($object, $name, $param);
}
$errors = $this->validator->validate($object, $constraint);
// ...
}
如果参数要求是唯一
,我使用作为参数传递的类,创建它的实例,设置唯一字段,并对对象进行验证。
我肯定会创建自己的以避免在验证后无用的对象创建,并使用EntityManager::findOneBy([params])
直接从返回的结果执行验证。