Symfony的有效表单总是返回false

时间:2015-12-13 23:00:53

标签: php forms symfony

我遇到了Symfony的问题。我创建我的表单,然后添加一个提交按钮,但我的表单始终无效。当我点击按钮时,它似乎没有任何反应......我尝试所有的方法来查看是否有错误但是没有......我已经尝试过这个解决方案,看看我是否已经有错误:Symfony2: my form returns false from isValid() but empty array for getErrors() from unique constraint condition。这是我的PHP代码:

public function addAction(Request $request) {

    $user = new User();

    // On ajoute les champs de l'entité que l'on veut à notre formulaire
    $form = $this->get('form.factory')->createBuilder('form', $user)
            //->setAction($this->generateUrl('testRegister'))
            ->add('email', 'text')
            ->add('name', 'text')
            ->add('firstname', 'text')
            ->add('login', 'text')
            ->add('password', 'password')
            ->add('save', 'submit')
            ->getForm()
    ;

    // On fait le lien Requête <-> Formulaire
    // À partir de maintenant, la variable $user contient les valeurs entrées dans le formulaire par le visiteur
    $form->handleRequest($request);
    if (!$form->isValid()) {
        print_r('Form is not valid...');



        print_r((string) $form->getErrors());
    }

    // On vérifie que les valeurs entrées sont correctes
    if ($form->isValid()) {
        print_r('It works !');
        // On enregistre notre objet dans la base de donnée
        $uri = "http://192.168.128.13:8081/DumontPerat/sharesite/person/";
        //On encode les données
        $data = array(
            'name' => $user->name,
            'firstname' => $user->firstname,
            'login' => $user->login,
            'password' => $user->password,
            'email' => $user->email,
            'isAdmin' => $user->isAdmin,
            'status' => $user->status
        );

        $response = \Httpful\Request::post($uri)
                ->sendsJson()
                ->body($data)
                ->send();
        // On redirige vers la page suivante
        return $this->render('ShareSiteGeneralBundle:Default:registerEnd.html.twig');
    }

    // On passe la méthode createView() du formulaire à la vue
    // afin qu'elle 
    // puisse afficher le formulaire toute seule
    return $this->render('ShareSiteGeneralBundle:Default:register.html.twig', array(
                'form' => $form->createView(),
    ));
}

这是我的观点(树枝):

    {%extends '::base.html.twig'%}
    {%block title%}Registration{%endblock%}
    {%block body%} 
    <h3>Registration</h3>

    <div class="well">
    {{ form_start(form, {'attr': {'class': 'form-horizontal'}}) }}

    {# Les erreurs générales du formulaire. #}
    {{ form_errors(form) }}
    <div class="form-group">
      {# Génération du label. #}
      {{ form_label(form.name, "Lastname :", {'label_attr': {'class': 'col-sm-3 control-label'}}) }}
      {{ form_errors(form.name) }}
      <div class="col-sm-4">
        {# Génération de l'input. #}
        {{ form_widget(form.name, {'attr': {'class': 'form-control'}}) }}
      </div>
    </div>
      <div class="form-group">
      {{ form_label(form.firstname, "Firstname :", {'label_attr': {'class': 'col-sm-3 control-label'}}) }}
      {{ form_errors(form.firstname) }}
      <div class="col-sm-4">
        {{ form_widget(form.firstname, {'attr': {'class': 'form-control'}}) }}
      </div>
    </div>
      <div class="form-group">
      {{ form_label(form.email, "Email :", {'label_attr': {'class': 'col-sm-3 control-label'}}) }}
      {{ form_errors(form.email) }}
      <div class="col-sm-4">
        {{ form_widget(form.email, {'attr': {'class': 'form-control'}}) }}
      </div>
    </div>
      <div class="form-group">
      {{ form_label(form.login, "Login :", {'label_attr': {'class': 'col-sm-3 control-label'}}) }}
      {{ form_errors(form.login) }}
      <div class="col-sm-4">
        {{ form_widget(form.login, {'attr': {'class': 'form-control'}}) }}
      </div>
    </div>
      <div class="form-group">
      {{ form_label(form.password, "Password :", {'label_attr': {'class': 'col-sm-3 control-label'}}) }}
      {{ form_errors(form.password) }}
      <div class="col-sm-4">
        {{ form_widget(form.password, {'attr': {'class': 'form-control'}}) }}
      </div>
    </div>    
   <div class="form-group">

{{ form_widget(form.save, {'attr': {'class': 'btn btn-primary'}}) }}
</div>
</div> 
{#<pre>{{ dump(form) }}</pre>#}
{{ form_end(form) }}
</div>
{% include 'ShareSiteGeneralBundle:Default:footer.html.twig' %}
{%endblock%}

非常感谢!

2 个答案:

答案 0 :(得分:1)

尝试使用submit()方法代替handleRequest,这样就会提交您的表单。

请注意,如果您的Symfony版本低于3.0,您仍然可以将$request传递给submit(),但请尝试避免这种情况,例如使用json_decode($request->getContent(), true)或其他内容,因为传递不推荐使用$request提交。

而且,在控制器中使用业务逻辑是非常糟糕的做法。尝试将您的逻辑放入模型中(例如,您必须为此使用服务)。

P.S。我看不到您为表单设置actionmethod的位置。

答案 1 :(得分:0)

更改

print_r((string) $form->getErrors())

print_r($form->getErrors(true))

查看错误数组的内容,包括子元素的错误。

<强>更新

此外,在查询任何结果之前,您应该检查表单是否已提交。

        $form->handleRequest($request);
        if ($form->isSubmitted())
        {
            if ($form->isValid()) {
               // [...]
               }
        }