编程语言
首页 > 编程语言> > php – Symfony 2:如何构建一个非常简单的表单,只需一个字段并在控制器中使用它

php – Symfony 2:如何构建一个非常简单的表单,只需一个字段并在控制器中使用它

作者:互联网

我正在建立一个入门程序.它非常简单:只需一个电子邮件字段和一个提交按钮.

程序如何运作
我只有一个控制器有两个方法:indexAction()和endAction()
indexAction只使用注释设置路径,并以手工形式显示树枝模板:

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;

class GetStartedController extends Controller
{
    /**
     * @Route("getstarted")
     * @Template()
     */
    public function indexAction()
    {
        return array(
            // ...
        );
    }

    /**
     * @Route("getstarted/end", name="getStartedEnd")
     * @Template()
     */
    public function endAction(Request $request)
    {

    // ... other code

正如您所看到的,目前该方法确实无效,因为表单是直接在树枝模板中手工制作的.

以下是呈现表单的代码(在twig模板中手工制作):

{% extends "::base.html.twig" %}

{% block title %}AppBundle:GetStarted:index{% endblock %}

{% block body %}
<form id="getStarted" action="{{ path('getStartedEnd') }}" method="post">
    <div class="form-group">
        <input type="email" name="userEmail" class="form-control input-lg" placeholder="Enter your e-mail (es.: your.name@example.com">
    </div>
    <button type="submit" name="submit" class="btn btn-default btn-lg">Submit</button>
</form>
{% endblock %}

我知道Symfony 2可以处理表格的creation和页面上的its rendering,但这是一个非常简单的形式,我知道它永远不会更复杂,所以手工制作的是最简单,最快的解决方案.

现在,问题是什么?问题是我不明白如何在我的控制器中获取表单及其提交的值,在另一个方法endAction()中.

表单的作用是另一个方法的路径,endAction(),在我的意图中,我将检索提交的值并用它们做一些事情.

按照Using a Form without a Class段的说明,我想出了方法endAction()的以下代码,在我的意图中,将检索提交的电子邮件并用它做一些事情 – 显然会创建一个用户 – (注意简单的退出)打印if的结果)

/**
 * @Route("getstarted/end", name="getStartedEnd")
 * @Template()
 */
public function endAction(Request $request)
{
    $form = $this->createFormBuilder()
        ->add('userEmail', 'email')
        ->add('submit', 'submit')
        ->getForm();

    $form->handleRequest($request);

    if ($form->isValid()) {
        $data = $form->getData();
        print_r($data);
    } else {
        echo 'no data submitted';
    }

    exit;


    return array(
            // ...
        );
}

问题是,如果($form-> isValid()){永远返回false,我得到的结果就是打印echo’没有提交数据’;

显然我的表单处理实现有问题,但是……什么?

这是我的问题:我做错了什么?为什么表单没有在控制器中“截获”?

解决方法:

你有两件事要做:

首先,编辑您的表单模板并使用正确的名称(name =“form [userEmail]”而不是name =“userEmail”):

<form name="form" method="post" action="{{ path('getStartedEnd') }}">
    <div id="form">
        <div>
            <label for="form_userEmail" class="required">User email</label>
            <input type="email" id="form_userEmail" name="form[userEmail]" required="required"/>
        </div>
        <div>
            <button type="submit" id="form_submit" name="form[submit]">Submit</button>
        </div>
    </div>
</form>

第二个禁用表单的csrf保护:

/**
 * @Route("getstarted/end", name="getStartedEnd")
 * @Template()
 */
public function endAction(Request $request)
{
   $data = array();
    $form = $this->createFormBuilder($data, array(
        'csrf_protection' => false,
    ))
    ->add('userEmail', 'email')
    ->add('submit', 'submit')
    ->getForm();

    $form->handleRequest($request);

    if ($form->isValid()) {
        $data = $form->getData();
        print_r($data);
    } else {
        echo 'no data submitted';
    }

    exit;


    return array(
        // ...
    );

 }

但强烈建议不要手工渲染表格!

它不仅仅是:

/**
 * @Route("getstarted")
 * @Template()
 */
public function indexAction()
{
    $data = array();
    $form = $this->createFormBuilder($data, array(
        'action' => $this->generateUrl('getStartedEnd'),
    ))
    ->add('userEmail', 'email')
    ->add('submit', 'submit')
    ->getForm();

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

并在您的模板中:

{# just this line #}
{{ form(form) }}

标签:php,forms,symfony,webforms,symfony-forms
来源: https://codeday.me/bug/20190830/1765456.html