加载资源
验证器组件使用元数据来验证值。此元数据定义了类、数组或任何其他值应如何验证。当验证一个类时,元数据由类本身定义。当验证简单值时,元数据必须传递给验证方法。
类元数据可以在配置文件或类本身中定义。验证器组件使用一组加载器收集该元数据。
另请参阅
您将在 元数据 中学习如何定义元数据。
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()
方法配置加载器和缓存。现在您必须将它们注入到您自己的自定义元数据工厂中。