提问者:小点点

UniqueEntity作为@validator->验证中的独立约束


我正在处理一个受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=


共2个答案

匿名用户

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])直接从返回的结果执行验证。