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

Как вы можете видеть, в настоящее время метод действительно ничего не делает, так как форма ручной работы непосредственно в шаблоне веточки.

Вот код для визуализации формы (ручной работы в шаблоне ветки):

{% 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.: [email protected]">
</div>
<button type="submit" name="submit" class="btn btn-default btn-lg">Submit</button>
</form>
{% endblock %}

Я знаю, что 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(
// ...
);
}

Проблема в том, что if ($form->isValid()) { когда-либо возвращает ложь, и я когда-либо получаю в результате печать echo 'no data submitted';

Очевидно, что-то не так с моей реализацией обработки формы, но … Что?

Это мой вопрос: что я делаю не так? Почему форма не «перехватывается» в контроллере?

3

Решение

Вам нужно сделать две вещи:

Сначала отредактируйте шаблон формы и используйте правильные имена (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) }}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]