Php 在不同的路径上处理表单,从它所在的位置开始';s建造的Symfony 3

Php 在不同的路径上处理表单,从它所在的位置开始';s建造的Symfony 3,php,forms,routes,symfony,handle,Php,Forms,Routes,Symfony,Handle,我实际上正在创建一个网站(使用symfony3),其中登录表单位于主页(route/)。我想在/login路径上处理此表单 不幸的是,我不知道怎么做,因为我的表单是在indexAction()中构建的,而我的loginAction()在$form内置索引中没有可见性 /** * @Route("/", name="home") */ public function indexAction() { $user = new User(); $form = $this->c

我实际上正在创建一个网站(使用symfony3),其中登录表单位于主页(route/)。我想在/login路径上处理此表单

不幸的是,我不知道怎么做,因为我的表单是在indexAction()中构建的,而我的loginAction()在$form内置索引中没有可见性

/**
 * @Route("/", name="home")
 */
public function indexAction()
{
    $user = new User();

    $form = $this->createFormBuilder($user)
        ->setAction($this->generateUrl('login'))
        ->setMethod('POST') //btw is this useless ?? Is it POST by default ?
        ->add('Login',   TextType::class)
        ->add('Password',    TextType::class)
        ->add('save', SubmitType::class, array('label' => 'Sign In'))
        ->getForm();

    return $this->render('ShellCodeHomeBundle:Home:index.html.twig', array (
        'login' => '',
        'form_signin' => $form->createView(),
    ));
}

/**
 * @Route("/login", name="login")
 */
public function loginAction(Request $request)
{
    $user = new User();

    //how do I handle the form ????
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        $em = $this->getDoctrine()->getManager();
        $user = $form->getData();
        //...
    }

    return $this->render('ShellCodeHomeBundle:Home:index.html.twig', array (
        'login' => $user->getLogin(),
    ));
}
我想这样说是没有用的,但我使用的是细枝,我插入的表单如下:

<div class="col-lg-12" style="text-align: center;">
    {{ form_start(form_signin) }}
    {{ form_widget(form_signin) }}
    {{ form_end(form_signin) }}
</div>

{{表格开始(表格签名)}
{{form_widget(form_signin)}
{{form_end(form_signin)}

希望你能帮助我!谢谢

不要在控制器中构建表单,这是一种糟糕的做法,因为您不能重用此代码

您应该在
FormType
中创建表单,并将其定义为服务。这样,您就可以根据需要随时重用此表单

取自下面链接的文档,下面是
FormType
的示例:

namespace AppBundle\Form;

use AppBundle\Entity\Post;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('summary', TextareaType::class)
            ->add('content', TextareaType::class)
            ->add('authorEmail', EmailType::class)
            ->add('publishedAt', DateTimeType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Post::class,
        ));
    }
}
然后可以使用
FormType
,如本例所示:

use AppBundle\Form\PostType;

// ...
public function newAction(Request $request)
{
    $post = new Post();
    $form = $this->createForm(PostType::class, $post);

    // ...
}

有关详细信息,请选中“请勿在控制器中构建表单”,这是一种不好的做法,因为您无法重用此代码

您应该在
FormType
中创建表单,并将其定义为服务。这样,您就可以根据需要随时重用此表单

取自下面链接的文档,下面是
FormType
的示例:

namespace AppBundle\Form;

use AppBundle\Entity\Post;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('summary', TextareaType::class)
            ->add('content', TextareaType::class)
            ->add('authorEmail', EmailType::class)
            ->add('publishedAt', DateTimeType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Post::class,
        ));
    }
}
然后可以使用
FormType
,如本例所示:

use AppBundle\Form\PostType;

// ...
public function newAction(Request $request)
{
    $post = new Post();
    $form = $this->createForm(PostType::class, $post);

    // ...
}

有关详细信息,请选中创建自定义表单类型

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\{
    PasswordType, SubmitType, TextType
};
use Symfony\Component\Form\FormBuilderInterface;

class LoginForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('Login', TextType::class)
            ->add('Password', PasswordType::class)
            ->add('save', SubmitType::class, [
                'label' => 'Sign In'
            ])
        ;
     }
 }

创建自定义表单类型

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\{
    PasswordType, SubmitType, TextType
};
use Symfony\Component\Form\FormBuilderInterface;

class LoginForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('Login', TextType::class)
            ->add('Password', PasswordType::class)
            ->add('save', SubmitType::class, [
                'label' => 'Sign In'
            ])
        ;
     }
 }

好的,但是如果我这样做,我将在indexAction()中创建表单,但是如何在loginAction()中处理表单呢?通过使用createForm()重新创建表单?没错。然后您只需使用
$form->handleRequest($request)
即可完成交易。好的,如果我这样做,我将在indexAction()中创建表单,但如何在loginAction()中处理表单?通过使用createForm()重新创建表单?没错。然后您只需使用
$form->handleRequest($request)
即可完成交易。您给出了与khorneholy相同的答案,因此我有一个相同的问题:如果这样做,我将在indexAction()中创建表单,但如何在loginAction()中处理表单?通过使用createForm()重新创建表单??您给出了与khorneholy相同的答案,因此我有相同的问题:如果我这样做,我将在indexAction()中创建表单,但如何在loginAction()中处理表单?通过使用createForm()重新创建表单??