The*_*nce 10 php validation zend-framework2
我正在尝试制作一个用户注册表单,用于检查密码字段的复杂程度.我根据文档编写了一个自定义验证器.此文件位于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 ...
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题出现在尝试在我的用户注册表单中使用此验证器.我尝试通过在Module.php中配置验证器将验证器添加到ServiceManager.
public function getServiceConfig() {
return array(
'invokables' => array(
'PasswordStrengthValidator' => 'User\Validator\PasswordStrength'
),
);
}
Run Code Online (Sandbox Code Playgroud)
然后我将它添加到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;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我访问该窗体并单击提交按钮时,我得到一个ServiceNotFoundException.
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for PasswordStrengthValidator
Run Code Online (Sandbox Code Playgroud)
我的ServiceManager配置有问题吗?我甚至不确定这是否是首先使用自定义验证器的合适方式.我已经找到了很多使用ZF1的例子,但是我发现的ZF2的文档和示例从未超出验证器的编写范围,以解决它与表单等的集成.任何建议都将不胜感激.
小智 6
您可以尝试这种解决方法...在Module.php中注册您的验证器,但使用函数getValidatorConfig或在关键'验证器'下的module.config.php中注册.
public function getValidatorConfig() {
return array(
'invokables' => array(
'PasswordStrengthValidator' => 'User\Validator\PasswordStrength'
),
);
}
Run Code Online (Sandbox Code Playgroud)
然后在你的User.php中,试试这个:(但你必须有权访问服务定位器,你可以从UserFactory等注入它)
$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);
Run Code Online (Sandbox Code Playgroud)
这适合我.
马丁
您尝试在示例中使用的“短名称”验证器加载仅在您Zend\Validator\ValidatorPluginManager
首先向验证器插件管理器 ( )注册该短名称/别名时才有效。
对此(以及我这样做的方式)的一种替代方法是在创建表单过滤器对象时注入必要的自定义验证器的实例。这是 ZfcUser 的做法:
// Service factory definition from Module::getServiceConfig
'zfcuser_register_form' => function ($sm) {
$options = $sm->get('zfcuser_module_options');
$form = new Form\Register(null, $options);
$form->setInputFilter(new Form\RegisterFilter(
new Validator\NoRecordExists(array(
'mapper' => $sm->get('zfcuser_user_mapper'),
'key' => 'email'
)),
new Validator\NoRecordExists(array(
'mapper' => $sm->get('zfcuser_user_mapper'),
'key' => 'username'
)),
$options
));
return $form;
},
Run Code Online (Sandbox Code Playgroud)
来源:https : //github.com/ZF-Commons/ZfcUser/blob/master/Module.php#L100
在这里,两个ZfcUser\Validator\NoRecordExists
验证器实例(一个用于电子邮件,一个用于用户名)被注入到注册表单 ( ZfcUser\Form\RegisterFilter
)的输入过滤器对象的构造函数中。
然后,在ZfcUser\Form\RegisterFilter
类内部,验证器被添加到元素定义中:
$this->add(array(
'name' => 'email',
'required' => true,
'validators' => array(
array(
'name' => 'EmailAddress'
),
// Constructor argument containing instance of the validator
$emailValidator
),
));
Run Code Online (Sandbox Code Playgroud)
来源:https : //github.com/ZF-Commons/ZfcUser/blob/master/src/ZfcUser/Form/RegisterFilter.php#L37
我相信另一种选择是使用完全限定的类名作为验证器名称(即:“User\Validator\PasswordStrength”而不仅仅是“PasswordStrengthValidator”),尽管我自己从未尝试过。
归档时间: |
|
查看次数: |
19047 次 |
最近记录: |