跳到内容

加载资源

编辑此页

验证器组件使用元数据来验证值。此元数据定义了类、数组或任何其他值应如何验证。当验证一个类时,元数据由类本身定义。当验证简单值时,元数据必须传递给验证方法。

类元数据可以在配置文件或类本身中定义。验证器组件使用一组加载器收集该元数据。

另请参阅

您将在 元数据 中学习如何定义元数据。

StaticMethodLoader

最基本的加载器是 StaticMethodLoader。此加载器通过调用类的静态方法来获取元数据。方法的名称使用验证器构建器的 addMethodMapping() 方法配置

1
2
3
4
5
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    ->addMethodMapping('loadValidatorMetadata')
    ->getValidator();

在此示例中,验证元数据通过执行类的 loadValidatorMetadata() 方法来检索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Mapping\ClassMetadata;

class User
{
    protected string $name;

    public static function loadValidatorMetadata(ClassMetadata $metadata): void
    {
        $metadata->addPropertyConstraint('name', new Assert\NotBlank());
        $metadata->addPropertyConstraint('name', new Assert\Length([
            'min' => 5,
            'max' => 20,
        ]));
    }
}

提示

您可以不多次调用 addMethodMapping() 来添加多个方法名称,还可以使用 addMethodMappings() 来设置支持的方法名称数组。

文件加载器

该组件还提供了两个文件加载器,一个用于加载 YAML 文件,另一个用于加载 XML 文件。使用 addYamlMapping()addXmlMapping() 来配置这些文件的位置

1
2
3
4
5
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    ->addYamlMapping('validator/validation.yaml')
    ->getValidator();

注意

如果您想加载 YAML 映射文件,那么您还需要安装 Yaml 组件

提示

与方法映射一样,您也可以使用 addYamlMappings()addXmlMappings() 来配置文件路径数组。

AttributeLoader

该组件提供了一个 AttributeLoader,用于从类的属性中获取元数据。例如

1
2
3
4
5
6
7
8
use Symfony\Component\Validator\Constraints as Assert;
// ...

class User
{
    #[Assert\NotBlank]
    protected string $name;
}

要启用属性加载器,请调用 enableAttributeMapping() 方法。

要在启用属性加载器后禁用它,请调用 disableAttributeMapping()

使用多个加载器

该组件提供了一个 LoaderChain 类,用于按定义的相同顺序顺序执行多个加载器

当您配置多个映射时,ValidatorBuilder 已经处理了这一点

1
2
3
4
5
6
7
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    ->enableAttributeMapping()
    ->addMethodMapping('loadValidatorMetadata')
    ->addXmlMapping('validator/validation.xml')
    ->getValidator();

缓存

使用许多加载器从不同位置加载元数据很方便,但这可能会降低应用程序的速度,因为每个文件都需要解析、验证并转换为 ClassMetadata 实例。

为了解决这个问题,请调用 Validator 构建器的 setMappingCache() 方法,并传递您自己的缓存类(该类必须实现 PSR-6 接口 Psr\Cache\CacheItemPoolInterface

1
2
3
4
5
6
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    // ... add loaders
    ->setMappingCache(new SomePsr6Cache())
    ->getValidator();

注意

加载器已经使用单例加载机制。这意味着加载器只会加载和解析文件一次,并将其放入属性中,下次请求元数据时将使用该属性。但是,验证器仍然需要合并来自每个加载器的单个类的所有元数据,当请求元数据时。

使用自定义 MetadataFactory

所有加载器和缓存都传递给 LazyLoadingMetadataFactory 的实例。此类负责从所有配置的资源创建 ClassMetadata 实例。

您还可以通过创建一个实现 MetadataFactoryInterface 的类来使用自定义元数据工厂实现。您可以使用 setMetadataFactory() 设置此自定义实现

1
2
3
4
5
6
use Acme\Validation\CustomMetadataFactory;
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    ->setMetadataFactory(new CustomMetadataFactory(...))
    ->getValidator();

警告

由于您正在使用自定义元数据工厂,因此您不能再使用 add*Mapping() 方法配置加载器和缓存。现在您必须将它们注入到您自己的自定义元数据工厂中。

本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可协议获得许可。
目录
    版本