Php Symfony 4获取实体的约束返回空数组

Php Symfony 4获取实体的约束返回空数组,php,symfony,symfony4,symfony-validator,Php,Symfony,Symfony4,Symfony Validator,我目前正在使用约束(也是自定义约束)和验证器组件对实体执行一些自定义验证。我希望按组获取实体的指定约束,以便在组中应用正确的约束 我看到了Symfony 2,似乎它在Symfony 4中不起作用 实体User.php: 类用户 { 私人$id; 私人电子邮件; 私人来源; ... } validation.yaml文件中配置的约束: App\Domain\User: properties: origin: - NotBlank: { groups: [user_crea

我目前正在使用约束(也是自定义约束)和验证器组件对实体执行一些自定义验证。我希望按组获取实体的指定约束,以便在组中应用正确的约束

我看到了Symfony 2,似乎它在Symfony 4中不起作用

实体
User.php

类用户
{
私人$id;
私人电子邮件;
私人来源;
...
}
validation.yaml
文件中配置的约束:

App\Domain\User:
  properties:
    origin:
      - NotBlank: { groups: [user_create] }
      - NotNull: { groups: [user_update] }

验证过程:

//通过注入获取组件并获取有效元数据
//还获取验证组用户_*的原始字段
$metadata=$this->validator->getMetadataFor(User::class);
//这将返回一个空数组
$constraints=$metadata->findConstraints('user_create');
//这还返回一个空数组
$constraints=$metadata->findConstraints('Default');
//空冲突,因为约束为空
$violations=$this->validator->validate($leadRequest,$constraints,'user_create');
转储
$metadata

ClassMetadata^ {#1551
  +name: "App\Domain\User"
  +defaultGroup: "User"
  +members: array:11 [
    "origin" => array:1 [
      0 => PropertyMetadata^ {#2472
        +class: "App\Domain\User"
        +name: "origin"
        +property: "origin"
        -reflMember: array:1 [
          "App\Domain\User" => ReflectionProperty {#2223
            +name: "origin"
            +class: "App\Domain\User"
            modifiers: "private"
          }
        ]
        +constraints: array:4 [
          0 => NotBlank^ {#5590
            +message: "This value should not be blank."
            +allowNull: false
            +normalizer: null
            +payload: null
            +"groups": array:1 [
              0 => "user_create"
            ]
          }
          1 => NotNull^ {#5567
            +message: "This value should not be null."
            +payload: null
            +"groups": array:1 [
              0 => "user_update"
            ]
          }

...
没有关于此功能的任何文档,因此可能此方法不再有效,或者我做错了什么


谢谢您的帮助。

我认为您必须定义要获取约束的属性

此代码适用于:

dd($metadata->properties['origin']->getConstraints());
但是:

也将返回一个空数组

您可以构建自己的组阵列:

$groups = [];
foreach ($metadata->properties as $property) {
    $constraints = $property->getConstraints();

    foreach ($constraints as $constraint) {
        foreach ($constraint->groups as $group) {
            $groups[$group] []= $constraint;
        }
    }
}
dd($groups);

也许没问题?validation.yaml文件在哪里?为什么不直接调用
$this->validator->validate($leadRequest,null,'user_create')?我的意思是,如果您需要对特定的“组”执行验证,只需使用它。
$constraints
字段只有在您需要同一“组”@VincentDecaux下的约束“子集”时才有用。缓存清除技巧不会进行任何更改,验证文件位于验证程序文档中所述的
config/validator/validation.yaml
中。您的
User.php
名称空间是否正确?您是否启用了@DonCallisto中所示的验证该方法工作正常,但我需要使用相同的约束执行一些操作,这就是为什么我需要获取这些约束。它工作正常,但我应该迭代所有属性,主要问题没有解决,因为我想通过特定组获取约束。也许我应该创建自己的方法,但它似乎已经在
GenericMetadata
类中实现了。这就是为什么它对我没有多大意义的原因,你可以构建自己的函数,这样,迭代所有属性,然后遍历所有约束,找到你想要的每个约束。见我的朋友,谢谢。显然,这是一个有效的临时解决方案。但是,
findConstraints
方法应该可以工作,但却不能,这一直困扰着我。此解决方案的一个问题是,在某些自定义约束中,
$this->context->getObject()
方法返回null,但我认为这是有效的,因为这些约束是手动构建的,使用
$this->context->getRoot()
为我提供了用户对象。
$groups = [];
foreach ($metadata->properties as $property) {
    $constraints = $property->getConstraints();

    foreach ($constraints as $constraint) {
        foreach ($constraint->groups as $group) {
            $groups[$group] []= $constraint;
        }
    }
}
dd($groups);