php - Zend Framework 2 自定义表单验证器

标签 php validation zend-framework2

我正在尝试制作一个用户注册表单来检查密码字段的复杂性。我已经根据 documentation 编写了一个自定义验证器来执行此操作.该文件位于我的“用户”模块中,位于 User\src\User\Validator。

<?php

namespace User\Validator;

use Zend\Validator\AbstractValidator;

class PasswordStrength extends AbstractValidator {

const LENGTH = 'length';
const UPPER  = 'upper';
const LOWER  = 'lower';
const DIGIT  = 'digit';

protected $messageTemplates = array(
    self::LENGTH => "'%value%' must be at least 6 characters long",
    self::UPPER => "'%value% must contain at least one uppercase letter",
    self::LOWER => "'%value% must contain at least one lowercase letter",
    self::DIGIT => "'%value% must contain at least one digit letter"
);

public function isValid($value) {
    ... validation code ...
}
}

我的问题出现在尝试在我的用户注册表中使用此验证器时。我尝试通过在 Module.php 中配置它来将验证器添加到 ServiceManager。

public function getServiceConfig() {
    return array(
        'invokables' => array(
            'PasswordStrengthValidator' => 'User\Validator\PasswordStrength'
        ),
    );
}

然后我将它添加到 User.php 中的输入过滤器。

public function getInputFilter() {
    if (!$this->inputFilter) {
        $inputFilter = new InputFilter();
        $factory     = new InputFactory();

        $inputFilter->add($factory->createInput(array(
            'name'     => 'username',
            'required' => true,
            'validators' => array(
                array(
                    'name'    => 'StringLength',
                    'options' => array(
                        'encoding' => 'UTF-8',
                        'min'      => 1,
                        'max'      => 100,
                    ),
                ),
            ),
        )));

        $inputFilter->add($factory->createInput(array(
            'name'     => 'password',
            'required' => true,
            'validators' => array(
                array(
                    'name'    => 'PasswordStrengthValidator',
                ),
            ),
        )));

        $this->inputFilter = $inputFilter;
    }

    return $this->inputFilter;
}

但是,当我访问表单并点击提交按钮时,我收到了 ServiceNotFoundException。

Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for PasswordStrengthValidator

我的 ServiceManager 配置有问题吗?我什至不确定这是否是首先使用自定义验证器的合适方法。我发现了很多使用 ZF1 的示例,但我发现的 ZF2 的文档和示例从未超出验证器的编写以解决其与表单的集成等问题。任何建议将不胜感激。

最佳答案

您可以试试这个解决方法... 在 Module.php 中注册您的验证器,但使用函数 getValidatorConfig 或在 module.config.php 中的键“validators”下注册。

public function getValidatorConfig() {
  return array(
    'invokables' => array(
        'PasswordStrengthValidator' => 'User\Validator\PasswordStrength'
    ),
  );
}

然后在你的 User.php 中,试试这个: (但你必须有权访问服务定位器,你可以从 UserFactory 等注入(inject)它)

$validatorManager = $this->getServiceLocator()->get('ValidatorManager');
// here you can test $validatorManager->get('PasswordStrengthValidator');

$validatorChain = new ValidatorChain();
$validatorChain->setPluginManager($validatorManager);

$inputFilter = new InputFilter();   
$inputFilter->getFactory()->setDefaultValidatorChain($validatorChain);

这对我有用。

马丁

关于php - Zend Framework 2 自定义表单验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13476164/

相关文章:

php - 保持在同一页面上 PHP 和 HTML

javascript - 验证复选框

mysql - 错误 e.rest apigility 如何创建数据库连接服务?

node.js - findAll 验证输入字段

zend-framework2 - Zend Framework 2 在模型类中访问全局配置

css - 在 ZF 2 中的模块之间共享相同布局和导航的最佳实践

php - 删除父级以及子级子级中的数据时,Laravel 外键约束错误

php - 用jQuery规划一个 "almost"即时通讯系统

php - 如何在 php 或 mysql 中添加两个或多个日期时间间隔的结果?

javascript - 包含多个文件和其他输入字段的表单验证