From 7642bb037e164fc815673fcc66c825c42a04851c Mon Sep 17 00:00:00 2001 From: Nathanael Noblet Date: Thu, 19 May 2016 15:15:36 -0600 Subject: [PATCH] Added callable validation_groups example Recently I had a need to dynamically set the validation_groups of a small set of forms based on the user that was logged in. In digging about the FormValidator::resolveValidationGroups and saw I could use a class that implements the __invoke method. Figured I might as well write something about it and see if you'd want to add it to the docs. --- book/forms.rst | 5 ++ cookbook/map.rst.inc | 1 + cookbook/validation/index.rst | 1 + .../validation-group-service-resolver.rst | 71 +++++++++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 cookbook/validation/validation-group-service-resolver.rst diff --git a/book/forms.rst b/book/forms.rst index 0fde7985056..04e4a63f19f 100644 --- a/book/forms.rst +++ b/book/forms.rst @@ -616,6 +616,11 @@ Now the form will skip your validation constraints. It will still validate basic integrity constraints, such as checking whether an uploaded file was too large or whether you tried to submit text in a number field. +.. seealso:: + + To see how to use a service with dependencies to resolve ``validation_groups`` + checkout cookbook article :doc:`/cookbook/validation/validation-group-service-resolver`. + .. index:: single: Forms; Built-in field types diff --git a/cookbook/map.rst.inc b/cookbook/map.rst.inc index dac8ec5c77d..dad5bf08f5e 100644 --- a/cookbook/map.rst.inc +++ b/cookbook/map.rst.inc @@ -249,6 +249,7 @@ * :doc:`/cookbook/validation/custom_constraint` * :doc:`/cookbook/validation/severity` + * :doc:`/cookbook/validation/validation-group-service-resolver` * :doc:`/cookbook/web_server/index` diff --git a/cookbook/validation/index.rst b/cookbook/validation/index.rst index d194c118025..0209c8b5267 100644 --- a/cookbook/validation/index.rst +++ b/cookbook/validation/index.rst @@ -6,3 +6,4 @@ Validation custom_constraint severity + validation-group-service-resolver diff --git a/cookbook/validation/validation-group-service-resolver.rst b/cookbook/validation/validation-group-service-resolver.rst new file mode 100644 index 00000000000..3b1601ae61d --- /dev/null +++ b/cookbook/validation/validation-group-service-resolver.rst @@ -0,0 +1,71 @@ +How to Dynamically Configure Validation Groups +============================================== + +Sometimes you need advanced logic to determine the validation groups. If this +can't be determined by a simple callback, you can use a service. Create a +service that implements ``__invoke`` which accepts a ``FormInterface`` as a +parameter. + +.. code-block:: php + + namespace AppBundle\Validation; + + use Symfony\Component\Form\FormInterface; + + class ValidationGroupResolver + { + private $service1; + + private $service2; + + public function __construct($service1, $service2) + { + $this->service1 = $service1; + $this->service2 = $service2; + } + + /** + * @param FormInterface $form + * @return array + */ + public function __invoke(FormInterface $form) + { + $groups = array(); + + // ... determine which groups to apply and return an array + + return $groups; + } + } + +Then in your form, inject the resolver and set it as the ``validation_groups``. + +.. code-block:: php + + use Symfony\Component\OptionsResolver\OptionsResolverInterface; + use Symfony\Component\Form\AbstractType + use AppBundle\Validator\ValidationGroupResolver; + + class MyClassType extends AbstractType + { + /** + * @var ValidationGroupResolver + */ + private $groupResolver; + + public function __construct(ValidationGroupResolver $groupResolver) + { + $this->groupResolver = $groupResolver; + } + + // ... + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'validation_groups' => $this->groupResolver, + )); + } + } + +This will result in the form validator invoking your group resolver to set the +validation groups returned when validating.