定制操作控制器中的验证

时间:2019-12-30 16:18:08

标签: rest symfony api-platform.com

我正在尝试仅在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;

有什么问题吗?

2 个答案:

答案 0 :(得分:1)

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

use ApiPlatform\Core\Validator\ValidatorInterface;

如果使用inface use Symfony\Component\Validator\Validator\ValidatorInterface,则必须是对象ConstraintViolationListInterface

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

/**
 * @Groups({"put-reset-password"})
 * @Assert\NotBlank(groups={"Default", "put-reset-password"})
 * @UserPassword(groups={"put-reset-password"})
 */
private $oldPassword;

这很奇怪,但是在添加"Default"之后,我的验证就可以在我的自定义操作中进行了。

有用的链接:

https://symfony.com/doc/current/validation/groups.html https://symfony.com/doc/current/validation/sequence_provider.html

P.S。对不起,我的英语不好。

答案 1 :(得分:0)

我有完全相同的情况,并且可以使用Default组,但是实际的解决方案是为验证器提供要验证的组:

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