PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了php-两次访问自定义验证器大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我在Symfony2项目上有一个自定义验证器.
验证工作正常,但是以某种方式两次访问了该方法.

这是我的自定义验证器:My other resolved question

问题是下一个

如您所见,错误消息显示两次.当我尝试在validate方法中进行var dump时,vardump也显示两次.知道为什么两次调用验证吗?当我使用$form-> bind($request);在我的控制器中.

编辑

这是树枝模板:

{% 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 %}

和控制器调用

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(),
    ) );
}

编辑2:

验证功能

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);  
    }   
}

和树枝模板:

{% 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>
                        &nbsp;
                    </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 %}

编辑3:

这是我将验证器应用于实体的方式:

/**
 * Manuscript
 *
 * @IsDOI()
 * @ORM\Table(name="manuscripts")
 * @ORM\Entity(repositoryClass="Merrin\MainBundle\Repository\ManuscriptRepository")
 * @ORM\HasLifecycleCallBACks
 * 
 */
class Manuscript
{
....
}

编辑4:

当我尝试推销

$form->getErrors();

我得到一个带有两个值的数组:

array(2) {
  [0]=&gt;
  object(Symfony\Component\Form\FormError)#507 (4) {
    ["message":"Symfony\Component\Form\FormError":private]=&gt;
    String(77) "The Publisher DOI abbreviation does not correspond to the DOI you filled in !"
    ["messageTemplate":protected]=&gt;
    String(77) "The Publisher DOI abbreviation does not correspond to the DOI you filled in !"
    ["messageParameters":protected]=&gt;
    array(0) {
    }
    ["messagePluralization":protected]=&gt;
    NULL
  }
  [1]=&gt;
  object(Symfony\Component\Form\FormError)#542 (4) {
    ["message":"Symfony\Component\Form\FormError":private]=&gt;
    String(77) "The Publisher DOI abbreviation does not correspond to the DOI you filled in !"
    ["messageTemplate":protected]=&gt;
    String(77) "The Publisher DOI abbreviation does not correspond to the DOI you filled in !"
    ["messageParameters":protected]=&gt;
    array(0) {
    }
    ["messagePluralization":protected]=&gt;
    NULL
  }
}

解决方法:

如果您正在使用validation groups并将验证器应用于多个组,则可以这样做. @IsDOI()注释是什么意思?如果可能应用验证,则可以先在validation.yml中添加验证器,然后再通过此自定义注释添加验证器.

大佬总结

以上是大佬教程为你收集整理的php-两次访问自定义验证器全部内容,希望文章能够帮你解决php-两次访问自定义验证器所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: