原文地址:https://www.drupal.org/node/2015613 [术语翻译] API: 应用程序接口 Validation API: 校验应用程序接口
Drupal 8的校验API
最后更新:2014年8月26日, fago创建于2013年6月9日
编辑:jbekker, roderik, fgm, jsruzicka
翻译:半截烟头
在Drupal 8, 实体校验已经被移到了一个单独的实体校验API里,并且已从表单校验解耦。将实体校验从表单校验里解耦允许校验实体可以独立于表单提交,比如通过RESTful WEB服务变更。这个新的校验API已经基于Symfony 校验器实现。
预览
校验是由一组约束条件来控制的,比如文本的最大长度或是一组允许值的限制等等。Symfony 有许多有用的约束,Drupal应用更多的Drupal规范扩展了这些约束。Drupal Symfony校验器已经被集成到了类型化数据 API,因此校验约束可以被作为实体字段定义的一部分来应用和定义,并且可以通用地定义为任何类型化数据。
使用此API
校验可以通过在任何类型化数据对象上调用validate()方法来被调用,如下面的例子:
<?php $definition = DataDefinition::create('integer') ->setConstraint('Range', array('min' => 5)); $typed_data = \Drupal::typedDataManager()->create($definition, 10); $violations = $typed_data->validate(); ?>
如果传递一个空值校验,将返回一个违规列表。
<?php if ($violations->count() > 0) { // Validation failed. } ?>
违规也是对象,它提供一个翻译过的违规信息给调用者:
<?php print $violations[0]->getMessage(); ?>
在这个例子里,一个“范围”约束被指定为数据定义的一部分。然而,基于数据类型,一些额外的约束会默认被这个类自动生成或添加。例如,一个电子邮件类型会添加约束以保证值是一个字符串并且是一个有效的电子邮件地址。所有被应用的约束都可以调用$typed_data->getConstraints()方法来检索。
在一个类型化数据对象上调用validate()方法是一个获取Symfony校验器和校验数据的快捷方式,而无论这个Symfony校验器对象是否被配置为必须的。$typed_data->validate()等于:
<?php return \Drupal::typedDataManager()->getValidator()->validate($typed_data); ?>
校验实体
实体字段和字段项也都是类型化数据对象,并且能被校验,如下例:
<?php $violations = $entity->field_text->validate(); ?>
这是一个校验一个实体是否为一个整体的例子:
<?php $violations = $entity->validate(); ?>
违规包含有指向校验失败的属性的属性路径,即相对于此对象,校验是从哪开始的。如:如果示例字段的文本(其位于$field[0]->value)校验失败,在第一个例子里,$violation->getPropertyPath()会返回属性路径如“0.value”,而在第二个例子里,会返回“field_text.0.value”。
将约束放到字段项的属性上
通过setPropertyConstraints()方法,实体字段定义简化了放置约束到独立的字段项属性。在接下来的例子中,字段定义放置了一个最大长度约束到字段项的“值”属性($field[0]->value):
<?php $fields['name'] = BaseFieldDefinition::create('string') ->setLabel(t('Name')) ->setPropertyConstraints('value', array('Length' => array('max' => 32))); ?>
与Symfony 校验器的关系
Drupal使用了Symfony的约束类和他们的校验逻辑(ConstraintValidator类),但是通过Drupal 8插件系统的来集成他们,因此他们可通过基于注释发现器来发现。这样做的结果是,在类型化数据定义里的约束引用都是插件ID。比如,上例中的“范围”就是指范围约束插件(类)。
Symfony校验器也被配置使用Drupal翻译类,因此违规信息可以正确的运行t()函数来显示。当Symfony 约束信息使用{{key}}语法来表示信息点位符时,这些信息会被正规的Drupal占位符(表单里的%key)来转换。为保持一致性,更多的Symfony约束暴露于Drupal时,都应该仿效这个方法。
文档
更多详情请点此阅读关于Symfony校验器。