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

时间:2016-02-25 01:05:02

标签: php symfony

我正在处理请求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

2 个答案:

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