首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用自定义操作类时,Symfony验证不适用于Api平台

当使用自定义操作类时,Symfony验证不适用于Api平台
EN

Stack Overflow用户
提问于 2020-01-29 11:29:07
回答 2查看 3.7K关注 0票数 4

我正在使用symfony 4和Api平台2.5。我已经创建了一个自定义操作来更改用户密码。

问题是,当我向发送空的oldPassword或任何其他必需的属性时,验证不起作用。如您所见,我使用了一个名为"change_password".的验证组。

这是实体用户的一部分:

代码语言:javascript
复制
/**
 * @ApiResource(
 *     itemOperations={
 *         "user_change_password"={
 *             "method"="PUT",
 *             "path"="/users/change-password/{id}",
 *             "controller"=UserChangePassword::class,
 *             "formats"={"json"},
 *             "denormalization_context"={"groups"={"user:change-password"}},
 *             "normalization_context"={"groups"={"user:read"}},
 *             "validation_groups"={"change_password"},
 *             "access_control"="is_granted('EDIT', object)",
 *             "access_control_message"="access denied"
 *         },
 *     },
 * )
 *
 */
class User implements UserInterface, \Serializable, EquatableInterface
{
    /**
     * @Assert\NotBlank(
     *     message=Tthis value should not be blank",
     *     groups={"change_password"}
     * )
     * @SecurityAssert\UserPassword(
     *     message = "Wrong value for your current password",
     *     groups={"change_password"}
     * )
     * @Groups({"user:change-password"})
     */
    private $oldPassword;

    /**
     * @Assert\NotBlank(
     *     message="This value should not be blank",
     *     groups={"registration", "change_password"}
     * )
     * @Assert\Length(
     *     min="6",
     *     max="32",
     *     minMessage="Password must be at least ({{ limit }}) characters.",
     *     maxMessage="Password must have a maximum of ({{ limit }}) characters.",
     *     groups={"registration", "change_password"}
     * )
     * @Groups({"user:write", "user:change-password"})
     */
    private $plainPassword;

    /**
     * @Assert\NotBlank(
     *     message="This value should not be blank",
     *     groups={"registration", "change_password"}
     * )
     * @Assert\Expression(
     *     "this.getPlainPassword() == this.getRetypedPlainPassword()",
     *     groups={"registration", "change_password"}
     * )
     * @Groups({"user:write", "user:change-password"})
     */
    private $retypedPlainPassword;

}

这是自定义操作类:

代码语言:javascript
复制
class UserChangePassword
{

    public function __invoke(User $data)
    {
        $errors = $this->validator->validate($data);
        if (count($errors) > 0) {
            throw new ValidationException($errors);
        }

        dd($errors) ;

        $oldPassword = $data->getOldPassword();
        if ($this->passwordEncoder->isPasswordValid($data, $oldPassword)) {
            // do changes
        }

        return $data;

    }
}

dd($erros)在oldPassword为空时的输出:

而没有 dd($erros)我得到了以下错误:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-30 10:27:32

First

对于v2.5+,将access_control替换为security。并将access_control_message替换为security_message

第二

如果不使用自定义控制器,请尝试将Default组添加到您的validation_groups中:

代码语言:javascript
复制
"validation_groups"={"Default", "change_password"},

或在约束中添加Default组:

代码语言:javascript
复制
//src/Entity/User.php

@Assert\NotBlank(groups={"Default", "change_password"})

并调用validate:

代码语言:javascript
复制
<?php
// src/Controller/Api/CustomClass.php

declare(strict_types=1);

namespace App\Controller\Api;

use ApiPlatform\Core\Validator\ValidatorInterface;
use App\Entity\User;

class CustomClass extends AbstractController
{
    /**
     * @var ValidatorInterface
     */
    private $validator;

    public function __construct(ValidatorInterface $validator) {
        $this->validator = $validator;
    }

    public function __invoke(User $data): User
    {
        $this->validator->validate($data);

        //other code ...
    }
}

此外,您还可以检查这个Url

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

因此,解决方案可以是这样的,而无需添加“默认”:

代码语言:javascript
复制
    $errors = $this->validator->validate($data, null, ['change_password']);
    if (count($errors) > 0) {
        throw new ValidationException($errors);
    }
票数 8
EN

Stack Overflow用户

发布于 2020-12-08 12:36:21

在我的例子中,我使用symfony 4.4,api-platform版本2.5是使用后续代码

代码语言:javascript
复制
$this->validator->validate($data,['groups'=>'register']);

而验证器是ApiPlatform\Core\Validator\ValidatorInterface的实例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59966119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档