Я строю процедуру начала работы. Это действительно очень просто: только одно поле для электронной почты и кнопка отправки.
КАК РАБОТАЕТ ПРОЦЕДУРА
У меня просто один контроллер с двумя методами: 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';
Очевидно, что-то не так с моей реализацией обработки формы, но … Что?
Это мой вопрос: что я делаю не так? Почему форма не «перехватывается» в контроллере?
Вам нужно сделать две вещи:
Сначала отредактируйте шаблон формы и используйте правильные имена (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) }}
Других решений пока нет …