Rest 自定义操作控制器中的验证

Rest 自定义操作控制器中的验证,rest,symfony,api-platform.com,Rest,Symfony,Api Platform.com,我试图只在api平台上的自定义操作上进行验证,但它不起作用 我只想在验证没有错误的情况下更改密码,但在任何情况下都会更改密码 如果我从验证注释中删除了验证组,它就会工作 例如,如果我将@Assert\NotBlank(groups={“put reset password”})替换为@Assert\NotBlank验证过程 这是实体的代码: "CHANGE-PASSWORD"={ "method"="PUT", "path"="/users/change-password/

我试图只在api平台上的自定义操作上进行验证,但它不起作用

我只想在验证没有错误的情况下更改密码,但在任何情况下都会更改密码

如果我从验证注释中删除了验证组,它就会工作

例如,如果我将@Assert\NotBlank(groups={“put reset password”})替换为@Assert\NotBlank验证过程

这是实体的代码:

  "CHANGE-PASSWORD"={
    "method"="PUT",
     "path"="/users/change-password/{id}",
     controller"="App\Controller\ChangePasswordController",
     "access_control"="is_granted('EDIT-PASSWORD', previous_object) and object == user",
     "openapi_context"={
        "summary"="Change Password"
     },
     "denormalization_context"={
        "groups"={"put-reset-password"}
     },
     "validation_groups"={"put-reset-password"},
  },
这是我的控制器

public function __invoke(User $data)
{

    // Validate data and handle validation errors
    $this->validator->validate($data);

    $data->setPassword($this->userPasswordEncoder->encodePassword($data, $data->getNewPassword()));


    $this->entityManager->flush();
    $token = $this->tokenManager->create($data);


    return $data;
}
这里是我使用验证组的一个属性

/**
 * @Groups({"put-reset-password"})
 * @Assert\NotBlank(groups={"put-reset-password"})
 * @UserPassword(groups={"put-reset-password"})
 */
private $oldPassword;
有什么问题吗

这是一种奇怪的行为。 您得到null可能是因为您使用了接口

使用apipplatform\Core\Validator\Validator接口

如果使用inface
使用Symfony\Component\Validator\Validator\Validator接口
,则必须是get object
ConstraintViolationListInterface

我也有类似的问题。以下解决方案帮助了我:

/**
 * @Groups({"put-reset-password"})
 * @Assert\NotBlank(groups={"Default", "put-reset-password"})
 * @UserPassword(groups={"put-reset-password"})
 */
private $oldPassword;
奇怪的是,在添加了
“Default”
之后,我的验证在我的自定义操作中进行

有用链接:


顺便说一句,很抱歉我的英语不好。

我有完全相同的案例,我只是做了一些事情来处理
默认的
组,但实际的解决方案是为验证器提供您想要验证的组:

public function __invoke(User $data)
{
    $this->validator->validate($data, null, 'put-reset-password');
    ...
}

验证器的validate方法返回约束冲突列表。您必须检查违规计数,以了解数据是否有效。@FlorianHermann在本例中,约束违规列表不返回任何内容,似乎当我将组放入属性断言时,验证失败。即使我var_dump($this->validator->validate($data)),我也有NULL。这似乎很奇怪,因为validate方法总是应该返回一个ConstraintViolationListInterface实例,即使验证没有问题。我知道,但我认为当我在断言中使用validations_组时,validator不喜欢您提到的自定义操作。您是否尝试过在自定义操作上应用验证组?谢谢你的帮助,伙计。我的案子完全一样,不起作用。