Zend Framework 2 validateurs personnalisés pour les formulaires
Je suis en train de faire un formulaire d'inscription qui vérifie la complexité du champ de mot de passe. J'ai écrit un validateur personnalisé pour ce faire, selon le la documentation. Ce fichier réside dans mon 'Utilisateur' module Utilisateur\src\Utilisateur\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 ...
}
}
Mon problème se pose en essayant d'utiliser ce programme de validation de mon formulaire d'inscription. J'ai essayé d'ajouter le validateur pour le ServiceManager en le configurant dans Module.php.
public function getServiceConfig() {
return array(
'invokables' => array(
'PasswordStrengthValidator' => 'User\Validator\PasswordStrength'
),
);
}
Puis je l'ai ajouté à l'entrée du filtre à 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;
}
Cependant, lorsque j'accède au formulaire et cliquez sur le bouton envoyer, je reçois un ServiceNotFoundException.
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for PasswordStrengthValidator
Est-il un problème avec mon ServiceManager de configuration? Je ne suis même pas sûr si ce est la bonne façon d'utiliser un validateur personnalisé en premier lieu. J'ai trouvé beaucoup d'exemples à l'aide de ZF1, mais la documentation et des exemples pour le ZF2 que j'ai trouvé ne jamais s'étendre au-delà de l'écriture du programme de validation à l'adresse de son intégration avec les formes, etc. Tout conseil serait grandement apprécié.
source d'informationauteur The Doge Prince
Vous devez vous connecter pour publier un commentaire.
Le "nom court" validateur de chargement que vous tentez d'utiliser dans votre exemple ne fonctionne que si vous vous inscrivez que le nom court de l' /alias avec le validateur du gestionnaire de plugin (
Zend\Validator\ValidatorPluginManager
).Une alternative à ce (et la façon dont je le fais), consiste à injecter des instances de validateurs personnalisés lors de la création de la forme de l'objet de filtre. C'est la façon dont ZfcUser:
Source: https://github.com/ZF-Commons/ZfcUser/blob/master/Module.php#L100
Ici, les deux
ZfcUser\Validator\NoRecordExists
programme de validation des instances (l'un pour e-mail et un nom d'utilisateur) sont injectés dans le constructeur du filtre d'entrée de l'objet pour le formulaire d'inscription (ZfcUser\Form\RegisterFilter
).Puis, à l'intérieur de la
ZfcUser\Form\RegisterFilter
classe, les validateurs sont ajoutés à l'élément définitions:Source: https://github.com/ZF-Commons/ZfcUser/blob/master/src/ZfcUser/Form/RegisterFilter.php#L37
Je crois que l'autre alternative est d'utiliser pleinement qualifié de la classe nom que le validateur nom (c'est à dire: "Utilisateur\Validator\PasswordStrength" au lieu de "PasswordStrengthValidator"), bien que je n'ai jamais essayé moi-même.
vous pouvez essayer cette solution de contournement...
registrer votre valideur Module.php mais avec la fonction getValidatorConfig ou dans module.config.php en vertu de la clé 'validators'.
Puis dans votre User.php, essayez ceci:
(mais vous devez avoir accès à un service de localisation, vous pouvez injecter de UserFactory etc.)
Cela fonctionne pour moi.
Martin
Supprimer votre invokable de configuration.
Et de modifier votre programme de validation des paramètres:
De travail pour moi.
Rufin solution fonctionne comme un charme. Les étapes que j'ai suivies pour utiliser un validateur personnalisé ont été (dans mon cas une URL du programme de validation pour vérifier si le web existe réellement):
1) Dans module.config.php
2) Dans le chemin d'accès Application/src/Application/Validators/UrlValidator.php
3) sous la forme
Supplémentaire) Dans le cas où vous souhaitez l'utiliser n'importe où dans l'application (c'est à dire à l'intérieur d'un contrôleur de l'action), vous pouvez récupérer à partir de la ValidatorManager plugin:
Oui, il peut être invokable comme l'a déclaré Conti ou de l'usine dans le cas où vous avez besoin d'injecter du gestionnaire de Service par exemple, ou de la Doctrine de l'entité gestionnaire dans l'exemple suivant. Il est très élégant, la solution de cette façon: