将服务注入自定义验证器

问题描述 投票:0回答:1

尝试创建自定义验证器,我需要使用其

isValid
方法中的服务。

如何注入该服务?

作为替代方案,我可以尝试从验证器方法中实例化服务,但服务构造函数需要一个控制器对象,而我当时没有。

这是验证器:

class OrderNumber extends AbstractValidator
{
    const EXIST = 'exist';

    /**
     * @var array
     *
     */
    protected $messageTemplates = array();

    /**
     * @var element name
     *
     */
    private $element = null;


    /**
     * Options for this validator
     *
     * @var array
     */
    protected $options = array(
        'manager' => null,  // set entity manager to find if value already exist
    );

    /**
     * Constructor
     *
     * @param  array|Traversable|int $options OPTIONAL
     */
    public function __construct($options)
    {
        $this->messageTemplates = array(
            self::INVALID => \Application\Util\Translator::translate("This value is required"),
        );

        if (!isset($options['element']) || empty($options['element'])) {
          throw new \Exception('Element name is not defined');
        }

        $this->element = $options['element'];

        parent::__construct();
    }

    /**
     * Returns true if and only if no record where found in Autoself for the value.
     *
     * @param  string $value
     * @return bool
     */
    public function isValid($value, array $context = null) {
      $isAvailable = $vehiculeService->orderNumberIsAvailable($value);

      if ($vehiculeService->orderNumberIsAvailable($value)) {
        return true;
      } else {
        return false;
      }
    }
}
php validation zend-framework2
1个回答
0
投票

我需要通过我的一个项目的验证器中的服务经理。 遇到与您相同的问题,我决定将服务管理器作为选项数组中的参数传递。 这是可能的代码:

public function __construct(array $options)
{
    $this->db_manager = $options['db_manager'];
    parent::__construct($options);
}

这里,db_manager 是一个服务管理器,仅包含我需要的内容。原则上,我从来没有得到全面的服务经理。

然后在表单中使用该验证器。为此,在表单的类中,我定义了一个方法 getInputFilterSpecification ,其中包含以下数组:

'recordSource' => [
            'name' => 'recordSource',
            'required' => true,
            'filters' => [
                [
                    'name' => 'StripTags'
                ],
                [
                    'name' => 'StringTrim'
                ],
                [
                    'name' => 'SbmPdf\Model\Filter\NomTable',
                    'options' => [
                        'db_manager' => $this->db_manager
                    ]
                ]
            ],
            'validators' => [
                [
                    'name' => 'SbmPdf\Model\Validator\RecordSource',
                    'options' => [
                        'db_manager' => $this->db_manager,
                        'auth_userId' => $this->auth_userId
                    ]
                ]
            ]
        ],

表格本身由工厂建造:

class DocumentPdfFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
    $db_manager = $serviceLocator->get('Sbm\DbManager');
    $pdf = $serviceLocator->get(Tcpdf::class);
    return new DocumentPdf($db_manager, ...);
}
© www.soinside.com 2019 - 2024. All rights reserved.