1

如何在 API 工具 GUI 中添加带有参数的自定义验证器?

我写了一个自定义验证器+工厂。

我那里有一些 setter+getter。

如何按照以下方式配置此验证器:

  • 显示在 GUI 的可用验证器列表中(我正在添加一个工厂来validators.factories键入module.config.php
  • 允许用户选择参数(例如maxlenminlen等)。现在它只显示一个可用的选项:breakchainonfailure

类似于 StringLength 验证器:

选项

我的工厂:

<?php

namespace My\Validator\DoctrineConnected\Factory;

use Interop\Container\ContainerInterface;
use Interop\Container\Exception\ContainerException;
use Laminas\ServiceManager\Exception\ServiceNotCreatedException;
use Laminas\ServiceManager\Exception\ServiceNotFoundException;
use Laminas\ServiceManager\Factory\AbstractFactoryInterface;

class ExistsValidatorFactory implements AbstractFactoryInterface {
    /**
     * Create an object
     *
     * @param  ContainerInterface $container
     * @param  string $requestedName
     * @param  null|array $options
     * @return object
     * @throws ServiceNotFoundException if unable to resolve the service.
     * @throws ServiceNotCreatedException if an exception is raised when
     *     creating a service.
     * @throws ContainerException if any other error occurs
     */
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) {
        $entityManger = $container->get('doctrine.entitymanger.orm_default');
        return new $requestedName($entityManger);
    }

    public function canCreate(ContainerInterface $container, $requestedName)
    {
        return class_exists($requestedName);
    }
}

4

1 回答 1

0

您必须在您module.config.php的模块中定义验证器元数据。

return [
    ...
    'validators' => [
        'factories' => [
            Validator\YourValidator::class => Validator\Factory\YourValidatorFactory::class,
        ],
    ],
    'validator_metadata' => [
        Validator\YourValidator::class => [
            'entity_class' => 'string',
            'fields' => 'string'
        ],
    ],
    ...
];

对于验证器元数据中定义的选项,您可以在验证器工厂中设置默认值。请避免使用Interop\Container包装并使用Psr\Container包装。

<?php
declare(strict_types=1);
namespace Application\Validator\Factory;

use Application\Validator\YourValidator;
use DoctrineORMModule\Options\EntityManager;
use Laminas\Stdlib\ArrayUtils;
use Psr\Container\ContainerInterface;

class YourValidatorFactory
{
    public function __invoke(
        ContainerInterface $container, 
        string $requestedName, 
        array $options = []
    ): AbstractValidator
    {
        if (isset($options['entity_class'])) {
            $repository = $container
                ->get(EntityManager::class)
                ->getRepository($options['entity_class']);
        }

        $options = ArrayUtils::merge($options, [ 
            'object_repository' => $repository,
        ]);
    }

    return new YourValidator($options);
}

您在验证器配置中定义的选项将作为$options参数传递给验证器工厂。这breakchainonfailure是 laminas 框架中验证器的默认选项。

于 2021-09-30T13:39:43.743 回答