如何在Laminas API Tools GUI中添加带参数的自定义验证器
API Tools GUI添加带参数自定义验证器的解决方案
1. 完成验证器在GUI可用列表的展示配置
你已经在validators.factories中注册了工厂,还需补充两项配置:
- 在
validators配置节点下添加aliases子项,给自定义验证器绑定短别名,方便GUI识别调用 - 在
api-tools-content-validation配置节点下新增metadata子项,注册验证器的基础元信息(显示名称、是否支持参数配置等),完整配置示例如下:
return [ 'validators' => [ 'factories' => [ \My\Validator\DoctrineConnected\ExistsValidator::class => \My\Validator\DoctrineConnected\Factory\ExistsValidatorFactory::class, ], 'aliases' => [ // 自定义别名,可根据需求修改 'MyExistsValidator' => \My\Validator\DoctrineConnected\ExistsValidator::class, ], ], 'api-tools-content-validation' => [ 'metadata' => [ \My\Validator\DoctrineConnected\ExistsValidator::class => [ // GUI中展示的验证器名称 'label' => 'Doctrine实体存在性验证器', ], ], ], // 其他原有配置 ];
配置完成后清空API Tools缓存,即可在GUI验证器列表中看到该选项。
2. 实现自定义参数的GUI配置功能
你当前看不到自定义参数有两个原因,分别修改即可:
2.1 修改自定义验证器类
- 继承Laminas官方的
Laminas\Validator\AbstractValidator基类,该基类已实现参数的读写逻辑,无需自行编写setter/getter - 在验证器类中声明允许配置的参数列表,示例代码如下:
<?php namespace My\Validator\DoctrineConnected; use Laminas\Validator\AbstractValidator; use Doctrine\ORM\EntityManager; class ExistsValidator extends AbstractValidator { // 声明自定义错误消息的常量,可根据需求修改 const NOT_EXISTS = 'entityNotExists'; const TOO_SHORT = 'stringTooShort'; const TOO_LONG = 'stringTooLong'; // 错误消息模板 protected $messageTemplates = [ self::NOT_EXISTS => '对应实体不存在', self::TOO_SHORT => '输入长度不能小于%minlen%', self::TOO_LONG => '输入长度不能大于%maxlen%', ]; // 声明支持的自定义参数,设置默认值 protected $options = [ 'entity_class' => null, 'check_field' => null, 'minlen' => 0, 'maxlen' => 0, ]; protected $entityManager; // 重载构造方法,先调用父类构造方法加载参数 public function __construct(EntityManager $entityManager, $options = null) { $this->entityManager = $entityManager; parent::__construct($options); } // 你的验证逻辑实现 public function isValid($value) { // 可直接通过$this->options获取配置的参数,比如$this->options['minlen'] // 编写对应校验逻辑即可 } }
2.2 修改工厂类
你当前的工厂方法没有把GUI传入的配置参数传递给验证器实例,修改__invoke方法即可:
public function __invoke(ContainerInterface $container, $requestedName, array $options = null) { // 注意你原代码中的EntityManager拼写错误,已修正 $entityManager = $container->get('doctrine.entitymanager.orm_default'); // 将参数传入验证器构造方法 return new $requestedName($entityManager, $options); }
2.3 补充参数元信息配置
在api-tools-content-validation.metadata中对应验证器的配置下,添加options子项,声明每个参数的GUI展示规则:
'api-tools-content-validation' => [ 'metadata' => [ \My\Validator\DoctrineConnected\ExistsValidator::class => [ 'label' => 'Doctrine实体存在性验证器', 'options' => [ 'entity_class' => [ 'label' => '实体类完整命名空间', 'type' => 'text', 'required' => true, ], 'check_field' => [ 'label' => '校验字段名', 'type' => 'text', 'required' => true, ], 'minlen' => [ 'label' => '最小长度', 'type' => 'number', 'required' => false, ], 'maxlen' => [ 'label' => '最大长度', 'type' => 'number', 'required' => false, ], ], ], ], ],
配置完成后清空缓存,即可在GUI中看到和StringLength验证器一致的参数配置表单。
内容的提问来源于stack exchange,提问作者Sfisioza
相关产品推荐
相关产品推荐

