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
相关产品推荐
相关产品推荐

