使用 [#Assert\Choice] 验证枚举类型

问题描述 投票:0回答:3

我正在尝试验证自定义 DTO 类中的枚举类型。我正在尝试使用 Symfony

#[Assert\Choice]
属性,但如果我传递错误的值,它似乎不起作用。

自定义DTO:

#[Assert\Choice(callback: 'getConditionTypes')]
public string $conditionType;

public static function getConditionTypes(): array
{
    return array_column(ConditionType::cases(), 'name');
}

枚举类:

enum ConditionType: string
{
    case NEW = "NEW";
    case USED = "USED";
    case CRASHED = "CRASHED";
    case BROKEN = "BROKEN";
    case FOR_PARTS = "FOR_PARTS";
}

当我尝试通过 Postman 传递带有错误值的条件类型时,例如

"conditionType": "rand"
,它会毫无问题地通过 DTO,并且我试图捕获是否存在错误值。我错过了什么?

php symfony
3个回答
7
投票

我没有提供回调并使用 Assert\Choice,而是使用

#[Assert\Type(type: ConditionType::class)]
,它会自动验证传递的值是否是此枚举的一部分。


0
投票

我使用了这种方法:

  1. 为我的枚举创建一个特征:
trait EnumDumperTrait
{
    public static function enumValues(): array
    {
        return array_map(static fn (BackedEnum $item): string|int => $item->value, self::cases());
    }

    public static function enumNames(): array
    {
        return array_map(static fn (BackedEnum $item): string => $item->name, self::cases());
    }
}

这些函数不仅在约束中有用。

  1. 向枚举添加特征
enum AttributeKeyEnum: string
{
    use EnumDumperTrait;

    case TotalCost = 'total_cost';
    case UserId = 'user_id';
}
  1. 在约束中使用:
$assertions = new Constraints\Collection([
    // other constraints
    'key' => [
        new Constraints\Choice(choices: AttributeKeyEnum::enumValues()),
    ],
]);
  1. 然后在需要时调用验证:
$validator->validate($data, $assertions)

$data 是任意数组,例如API请求的内容。


0
投票
interface EnumValidate
{
    public static function validate(string $item): bool;
}

trait ValidateEnumTrait
{
    public static function validate(string $item): bool
    {
        return self::tryFrom($item) instanceof self;
    }
}

enum MyEnum: string implements EnumValidate
{
    use ValidateEnumTrait;
...

在 DTO 中

#[Assert\Callback([MyEnum::class, 'validate'])
© www.soinside.com 2019 - 2024. All rights reserved.