Symfony2我的提交按钮没有显示在$ form-> createView()上

Symfony2我的提交按钮没有显示在$ form-> createView()上

问题描述:

New Symfony user here.. I'm experimenting with different ways of creating forms on my own by hand, so I may learn more about how symfony works. I've created a form based on an Entity. The form displays but the submit button does not show up.

/**
 * @Route("/register")
 * @Template()
 */
public function registerAction(Request $request)
{
    $user = new User();
    $form = $this->createForm(new RegisterType(), $user);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $user = $form-getData();
        $user->setPassword($this->encodePassword($user, $user->getPlainPassword()));
        $em = $this->getDoctrine()->getManager();
        $em->persist($user);
        $em->flush();
        $url = $this->generateUrl('/home');
        return $this->redirect($url);
    }

    return array(
        'entity' => $user,
        'form'   => $form->createView(),
    );   
}

And for now just a minimal template.

{% extends '::base.html.twig' %}
{% block body -%}
<h1>Register</h1>
{{ form(form) }}
{% endblock %}

And here is the type.

<?php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class RegisterType extends AbstractType {

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', 'text')
            ->add('email', 'email')
            ->add('plainPassword', 'repeated', array(
                'type'=>'password'));
    }


    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\User'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'registration_form';
    }

 }

As I said in my comment, submit type was missing, which leads to a missing submit button. I don't know exactly which example you have been reading, but pretty much most of them have this added in Symfony's official documentation.

More on the subject can be found here.

The Best Practices on the Symphony website now state that you should define buttons in the template and not in the form type definition. The reason for this is that defining it in the type definition makes the form less reusable. E.g. if you want to use the same form for creating and editing an object, you may want the buttons label to say "Create" on the create page, but "Update" on the edit page.

See here:

http://symfony.com/doc/current/best_practices/forms.html#form-button-configuration

So in your case, change your template like this:

{% extends '::base.html.twig' %}
{% block body -%}
    <h1>Register</h1>
    {{ form_start(form) }}
    {{ form_widget(form) }}
    <input type="submit" value="Submit" />
    {{ form_end(form) }}
{% endblock %}