2
votes

Could someone help me figure out why my Callback validation method is not being called.

Basically what I need to do is a custom validation with following logic: - in the form I have 5 fields that if all empty, the form should be valid, - however if any of the is not empty all of them need to not be empty (they are used to build a real address on a user profile)

I have followed the doc from: http://symfony.com/doc/2.3/reference/constraints/Callback.html

I have the following code:

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="UserRepository");
 * @UniqueEntity("email")
 * @ORM\HasLifecycleCallbacks
 * @Assert\Callback(methods={"isAddressValid"})
 */
class User extends WebserviceUser implements UserInterface, EquatableInterface
{
...

    public function isAddressValid(ExecutionContextInterface $context)
    {
        //die("I GOT HERE");
        $context->addViolationAt('sna4', 'Frikin validation'!', array(), null);
    }
}

The property sna4 is found in the class being extended.

Thank you in advance.

1
did you call isValid() in your controller? code from your controller would help!pmoubed
check you add the use statement for the ExecutionContextInterface classMatteo
@Matteo..... I confirm including the useValentin Maior
@PMoubed...yes I have called isValid code if ($form->isSubmitted() && $form->isValid()) codeValentin Maior
The form have a validation_groups?Matteo

1 Answers

4
votes

The callback annotation require (if any is defined) the validation group associated.

As Example, an entity used in different form context with a validation custom for a specific form:

The Entity Class:

/**
 *
 * @Assert\Callback(methods={"validateCommunicationEmail"}, groups={"userProfile"})
 * @Assert\Callback(methods={"validatePreference"}, groups={"userPreference"})
 */
class AcmePreferences
{

    ....

        public function validateCommunicationEmail(ExecutionContextInterface $context)
    {
        if ($this->getIsCommunicationsEnabled() && ! $this->getAdministrativeCommunicationEmail())
        {
            $context->addViolationAt('isCommunicationsEnabled','error.no_administrative_email_selected');
        }

    }

}

The Form Type:

class AcmePreferencesType extends AbstractType
{

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'=> 'Acme\DemoBundle\Entity\AcmePreferences',
            'validation_groups' => array('userProfile')
        ));
    }