我正在尝试制作一个用户注册表单来检查密码字段的复杂性。我已经根据 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/