gpt4 book ai didi

php - Symfony 2 : How to build a really simple form, 只有一个字段并在 Controller 中使用它

转载 作者:可可西里 更新时间:2023-11-01 00:43:02 25 4
gpt4 key购买 nike

我正在构建一个入门程序。它真的非常简单:只有一个电子邮件字段和一个提交按钮。

程序如何运作我只有一个 Controller 和两个方法:indexAction()endAction()indexAction 简单地使用注释设置路由,并以手工制作的形式显示 Twig 模板:

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 模板中手工制作的。

这是渲染表单的代码(在 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在页面上,但这是一个非常简单的表格,我知道它永远不会更复杂,所以手工制作的表格是最简单和最快的解决方案。

现在,问题是什么?问题是我不明白如何在我的 Controller 中获取表单及其提交的值,使用另一种方法 endAction()

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

按照段落 Using a Form without a Class 中的说明进行操作,我为 endAction() 方法想出了以下代码,在我的意图中,它将检索提交的电子邮件并对其执行某些操作 - 显然会创建一个用户 - (注意 exit 简单地打印 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(
// ...
);
}

问题是 if ($form->isValid()) { 曾经返回 false,结果我得到了打印 echo 'no data submitted';

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

这是我的问题:我做错了什么?为什么表单在 Controller 中没有被“拦截”?

最佳答案

你有两件事要做:

首先,编辑您的表单模板并使用正确的名称(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 - Symfony 2 : How to build a really simple form, 只有一个字段并在 Controller 中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28781827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com