Comment permettre à des valeurs vides dans symfony2 validateurs
Je voudrais appliquer les validateurs sur une des propriétés de l'objet uniquement lorsque la valeur n'est pas vide, c'est à dire.
Maintenant un standard de symfony comportement:
class Entity
{
/**
* @ORM\Column(type="string", nullable=true)
* @Assert\Email()
*/
protected $email;
(...)
}
que l'objet ne sera pas validée si un courriel est la valeur null ou une chaîne vide, il est un moyen de dire validateur d'affirmer comme valide, la valeur est vide, et de valider uniquement si le champ contient des données?
PS je sais que je peux écrire rappel du programme de validation, mais l'écriture de rappel pour chaque champ, juste pour avoir "allowEmpty" fonctionnalité n'est pas tellement agréable.
Vous devez vous connecter pour publier un commentaire.
Vous devez définir explicitement
'required' => false
dans votreFormBuilder
classe pour tous les champs facultatifs. Voici un paragraphe décrivant type de champ options.Modifier. Quelques uns downvotes. Par défaut tous validateurs traiter
null
valeurs valides, saufNotNull
etNotEmpty
. Aucun des deux a été utilisé dans la question. La question est implicitement sur la façon de désactiver le côté clientrequired
attribut qui est activée par défaut.NotNull()
etNotEmpty()
contraintes. Voyant que le demandeur avait aucune de ces contraintes, il est donc implicite que le problème était avec le côté client HTML5required
attribut.required
attribut n'ont rien de commun avec la valeur vide approuvé. Il n'est utilisé que par HTML5 validation côté client et il n'est pas lié à la validation (côté serveur) à tous.Réglage de la
required
option n'est pas la solution:http://symfony.com/doc/current/book/forms.html#field-type-options
Pour mon validateurs personnalisés, j'ai ajouter un
à la
isValid()
méthode. Cependant, je ne suis pas sûr de ce que serait la meilleure façon pour la norme du programme de validation des classes.si je comprends bien, vous voulez la validation côté serveur uniquement si la valeur saisie. Je suis exactement dans le même scénario. Je veux valider une URL que si l'URL est fournie. La meilleure façon que j'ai rencontré a été d'écrire mon propre validation de classe. Vous pouvez écrire un générique de validation personnalisée classe.
J'ai suivi ce lien https://symfony-docs-chs.readthedocs.org/en/2.0/cookbook/validation/custom_constraint.html l'exception de quelques changements en raison de symfony version la plus récente.
Ici est la mise en œuvre
Acme\BundleNameBundle\Validator\Constraints\cstmUrl
Acme\BundleNameBundle\Validator\Constraints\cstmUrlValidator
Validtion.yml
à l'intérieur du Contrôleur de juste lier la contrainte que vous le feriez normalement ne
Je suis sûr qu'il y a peut être d'autres façons de faire, mais pour l'instant je pense que ça fait bien le travail.
Juste au cas où quelqu'un d'autre vient à travers cette même question. Je préfère personnellement le résoudre en ajoutant l'attribut suivant à l'intérieur de mon template Twig:
required
approche, de l'utilisation gilden la suggestion de la place, et l'ajouter à la form builder..Ici, c'est le truc que j'ai trouvé en fait :
https://github.com/symfony/symfony/issues/5906
Vous avez besoin d'écrire des données transformateur qui ne fait rien, et puis de l'ajouter à votre domaine.
Après cela, juste appeler la méthode submit() avec le deuxième paramètre à false.
Noter que c'est ok avec Symfony 2.3.
Le Type de Champ de Deviner gérer cela.
http://symfony.com/doc/current/book/forms.html#field-type-guessing
Il dépend de votre formulaire de déclaration : "La "prédiction" est activée lorsque vous omettez le second argument de la méthode add () (ou si vous passez null). Si vous passez un tableau d'options comme le troisième argument (fait pour dueDate ci-dessus), ces options sont appliquées à l'aurez deviné champ."