我正在尝试验证自定义 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,并且我试图捕获是否存在错误值。我错过了什么?
我没有提供回调并使用 Assert\Choice,而是使用
#[Assert\Type(type: ConditionType::class)]
,它会自动验证传递的值是否是此枚举的一部分。
我使用了这种方法:
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());
}
}
这些函数不仅在约束中有用。
enum AttributeKeyEnum: string
{
use EnumDumperTrait;
case TotalCost = 'total_cost';
case UserId = 'user_id';
}
$assertions = new Constraints\Collection([
// other constraints
'key' => [
new Constraints\Choice(choices: AttributeKeyEnum::enumValues()),
],
]);
$validator->validate($data, $assertions)
$data 是任意数组,例如API请求的内容。
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'])