Aer*_*dir 3 php forms webforms symfony-forms symfony
我正在建立一个入门程序.它非常简单:只需一个电子邮件字段和一个提交按钮.
程序如何工作
我只有一个带有两种方法的控制器: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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,目前该方法确实无效,因为表单是直接在树枝模板中手工制作的.
以下是呈现表单的代码(在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 %}
Run Code Online (Sandbox Code Playgroud)
我知道Symfony 2可以在页面上处理表单的创建及其渲染,但这是一个非常简单的形式,我知道它永远不会更复杂,所以手工制作是最简单,最快速的解决方案.
现在,问题是什么?问题是我不明白如何在我的控制器中获取表单及其提交的值,在另一种方法中endAction().
该表单具有作为其他方法的路径的动作endAction(),在我的意图中,我将检索提交的值并用它们做一些事情.
继段落的指示使用窗体无类,我想出了方法下面的代码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(
// ...
);
}
Run Code Online (Sandbox Code Playgroud)
问题是,if ($form->isValid()) {永远不会返回错误,我得到的结果是印刷echo 'no data submitted';
显然我的表单处理实现有问题,但是......什么?
这是我的问题:我做错了什么?为什么表单没有在控制器中"截获"?
你有两件事要做:
首先,编辑您的表单模板并使用正确的名称(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>
Run Code Online (Sandbox Code Playgroud)
第二个禁用表单的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(
// ...
);
}
Run Code Online (Sandbox Code Playgroud)
但强烈建议不要手工渲染表格!
它不仅仅是:
/**
* @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(),
);
}
Run Code Online (Sandbox Code Playgroud)
并在您的模板中:
{# just this line #}
{{ form(form) }}
Run Code Online (Sandbox Code Playgroud)