You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony是否存在数组元素正则校验断言?

Symfony数组元素正则校验的实现方案

一、利用现有断言组合实现(无需自定义)

Symfony Validator组件本身没有直接提供AssertArrayRegex这类单一断言,但可以通过All断言搭配Regex断言的组合,实现对数组每个元素的正则校验需求,代码示例如下:

use Symfony\Component\Validator\Constraints as Assert;

class YourEntity
{
    #[Assert\All([
        new Assert\Regex(pattern: '/[0-9]{2}/')
    ])]
    public array $variables = [];
}

该配置可以实现你需要的校验逻辑:

  • 可通过校验的数组:
$array = [
    '12',
    '13'
];
  • 无法通过校验的数组:
$array = [
    '12',
    '1'
];

二、自定义断言(追求更简洁的注解写法)

如果觉得All+Regex的组合写法不够简洁,你可以自定义一个AssertArrayRegex断言,步骤如下:

1. 定义断言类

namespace App\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

#[\Attribute]
class AssertArrayRegex extends Constraint
{
    public string $pattern;
    public string $message = 'Each element must match the regex pattern "{{ pattern }}".';

    public function __construct(string $pattern, ?string $message = null, array $groups = null, mixed $payload = null)
    {
        parent::__construct($groups, $payload);

        $this->pattern = $pattern;
        if ($message !== null) {
            $this->message = $message;
        }
    }
}

2. 实现断言校验器

namespace App\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;
use Symfony\Component\Validator\Constraints\Regex;

class AssertArrayRegexValidator extends ConstraintValidator
{
    public function validate(mixed $value, Constraint $constraint): void
    {
        if (!$constraint instanceof AssertArrayRegex) {
            throw new UnexpectedTypeException($constraint, AssertArrayRegex::class);
        }

        if (!is_array($value)) {
            throw new UnexpectedValueException($value, 'array');
        }

        $regexConstraint = new Regex([
            'pattern' => $constraint->pattern,
            'message' => $constraint->message,
        ]);

        foreach ($value as $key => $element) {
            $this->context->getValidator()->inContext($this->context)
                ->atPath('[' . $key . ']')
                ->validate($element, $regexConstraint);
        }
    }
}

3. 使用自定义断言

use App\Validator\Constraints\AssertArrayRegex;

class YourEntity
{
    #[AssertArrayRegex('/[0-9]{2}/')]
    public array $variables = [];
}

内容的提问来源于stack exchange,提问作者LinChan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:01:04