我正在处理请求ParamFetcher的灵感来自FOSRestBundle ParamFetcher。
ParamFetcher用于在Controller操作中验证和检索请求正文中的参数。
每个参数都可以有一个或多个要求,可以是Regex或其他约束(例如" Email constraint。)。
要验证其中一个,我使用以下内容:
.thirdParty
如何对UniqueEntity约束使用相同的行为?
我没有(并且不能)使用执行断言的任何FormType,并且约束的默认用法是将其映射到相应实体中的相应字段,但字段需要直接从动作中动态设置。
可能将实体名称空间作为第二个参数传递给约束,以便使用约束验证器中的// ...
$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
。
答案 0 :(得分:1)
UniqueEntity是一个类约束,它意味着validate
方法接收一个对象作为第一个参数。像这样:
$this->get('validator')->validate($obj, new UniqueEntity(FIELD));
如果您的验证逻辑很复杂,您还可以将自己的验证约束创建为described here。
答案 1 :(得分:0)
最后,我使用以下内容来实现这一目标:
$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);
// ...
}
如果param需要unique
,我使用作为参数传递的类,创建它的实例,设置唯一字段,并对对象进行验证。
我肯定会创建自己的,以避免验证后无用的对象创建,并使用EntityManager::findOneBy([params])
直接从返回的结果执行验证。