Php Symfony 4获取实体的约束返回空数组
我目前正在使用约束(也是自定义约束)和验证器组件对实体执行一些自定义验证。我希望按组获取实体的指定约束,以便在组中应用正确的约束 我看到了Symfony 2,似乎它在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
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);