パスワードフィールドの複雑さをチェックするユーザー登録フォームを作成しようとしています。ドキュメントに従ってこれを行うためのカスタムバリデーターを作成しました。このファイルは、User \ src \ User\Validatorの「User」モジュールにあります。
<?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のドキュメントと例は、フォームなどとの統合に対処するためのバリデーターの記述を超えることはありません。アドバイスをいただければ幸いです。