Custom validator accessed twice
customvalidator, dependency-injection, php, symfony
Solution
This is possible if you are using validation groups and apply validator to several groups. And what `@IsDOI()` annotation mean? If its apply validation possible that you first add validator in `validation.yml` and second via this custom annotation.
Problem
I have a custom validator on my Symfony2 project. The validation works fine, but the method is somehow accessed twice. Here is my custom validator: My other resolved question The problem is the next: As you can see, the error message is displayed twice. When I am trying to var dump something in the validate method, the vardump is also displayed twice. Any idea why the validate is called twice? This is called when I am using $form->bind($request); in my controller. EDIT Here is the twig template: ``` {% extends 'MerrinMainBundle::layout.html.twig' %} {% block page_title %} MDPI Conversion system (Merrin) 3.0 - New Conversion {% endblock %} {% block main %} {% for flashMessage in app.session.flashbag.get('user-notice') %} <div class="flash-notice"> {% autoescape false %} {{ flashMessage }} {% endautoescape %} </div> {% endfor %} <h1>Create New Manuscript</h1> {% if valid == false %} <div class="error"> {{ form_errors(form) }} {{ form_errors(form.doi) }} {{ form_errors(form.publisher) }} {{ form_errors(form.file) }} </div> {% endif %} <form action="{{ path }}" method="POST" {{ form_enctype(form) }}> </form> {% endblock %} ``` And the controller call ``` public function createAction() { $em_scipub = $this->getDoctrine()->getManager(); $em_mdpipub = $this->getDoctrine()->getManager('mdpipub'); $enquiry = new Manuscript(); $formType = new NewManuscriptType(); $form = $this->createForm($formType, $enquiry); $request = $this->getRequest(); $valid = true; $error = ''; if ($request->isMethod('POST')) { $form->bind($request); if ($form->isValid()) { ... do something ... $em_scipub->persist($enquiry); $em_scipub->flush(); $flash_message = "<a href='edit/".$enquiry->getId()."'>New Manuscript</a> sucessfully created."; $this->get('session')->getFlashBag()->set('user-notice', $flash_message); return $this->redirect($this->generateUrl('MerrinMainBundle_new')); } else $valid = false; } $path = $this->generateUrl('MerrinMainBundle_new'); return $this->render('MerrinMainBundle:Pages:new_conversion.html.twig.twig', array( 'valid' => $valid, 'path' => $path, 'form' => $form->createView(), ) ); } ``` EDIT2: The validate function: ``` public function validate($value, Constraint $constraint) { $doi = $value->getDoi(); preg_match('/[^\/]+/i', $doi, $publisherDoiAbbr); if($publisherDoiAbbr[0] !== $value->getPublisher()->getDoiAbbreviation()) { $this->context->addViolation($constraint->message_publisher_DOI); } else { preg_match("/[a-z]+/",$doi, $journalDoiAbbr); $em_mdpipub = $this->entityManager; $journal = $em_mdpipub->getRepository('MerrinMdpiPubBundle:Journal')->findOneBy(array('doi_abbreviation' => $journalDoiAbbr)); if($journal == null) { $this->context->addViolation($constraint->message_journal_DOI); } } preg_match('/\d*$/i', $doi, $doiNumericPart); if(strlen($doiNumericPart[0]) < 8) { $this->context->addViolation($constraint->message_volume_issue_firstpage_DOI); } } ``` And the twig template: ``` {% extends 'MerrinMainBundle::layout.html.twig' %} {% block page_title %} MDPI Conversion system (Merrin) 3.0 - New Conversion {% endblock %} {% block main %} {% for flashMessage in app.session.flashbag.get('user-notice') %} <div class="flash-notice"> {% autoescape false %} {{ flashMessage }} {% endautoescape %} </div> {% endfor %} <h1>Create New Manuscript</h1> {% if valid == false %} <div class="error"> {{ form_errors(form) }} {{ form_errors(form.doi) }} {{ form_errors(form.publisher) }} {{ form_errors(form.file) }} </div> {% endif %} <form action="{{ path }}" method="POST" {{ form_enctype(form) }}> <div style="float:left;"> <table width="700"> <tr> <td> {{ form_label(form.doi) }} </td> <td> {{ form_widget(form.doi, { 'attr': {'size': 40} }) }} </td> </tr> <tr> <td> {{ form_label(form.publisher) }} </td> <td> {{ form_widget(form.publisher) }} </td> </tr> <tr> <td> {{ form_label(form.file) }} </td> <td> {{ form_widget(form.file) }} </td> </tr> <tr> <td> </td> <td> <input class="submit-confirm-button" type="submit" name="update-text" value="submit" /> <a class="cancel-link" href="{{ path('MerrinMainBundle_homepage' ) }}">Cancel</a> </td> </tr> </table> </div> {{ form_rest(form) }} </form> {% endblock %} ``` EDIT 3: Here is how I am applying the validator to the entity: ``` /** * Manuscript * * @IsDOI() * @ORM\Table(name="manuscripts") * @ORM\Entity(repositoryClass="Merrin\MainBundle\Repository\ManuscriptRepository") * @ORM\HasLifecycleCallbacks * */ class Manuscript { .... } ``` EDIT 4: When I try to vardump the ``` $form->getErrors(); ``` I am getting an array with two values: ``` array(2) { [0]=> object(Symfony\Component\Form\FormError)#507 (4) { ["message":"Symfony\Component\Form\FormError":private]=> string(77) "The Publisher DOI abbreviation does not correspond to the DOI you filled in !" ["messageTemplate":protected]=> string(77) "The Publisher DOI abbreviation does not correspond to the DOI you filled in !" ["messageParameters":protected]=> array(0) { } ["messagePluralization":protected]=> NULL } [1]=> object(Symfony\Component\Form\FormError)#542 (4) { ["message":"Symfony\Component\Form\FormError":private]=> string(77) "The Publisher DOI abbreviation does not correspond to the DOI you filled in !" ["messageTemplate":protected]=> string(77) "The Publisher DOI abbreviation does not correspond to the DOI you filled in !" ["messageParameters":protected]=> array(0) { } ["messagePluralization":protected]=> NULL } } ```