在嵌入式控制器中处理Symfony表格

时间:2014-07-29 02:44:32

标签: php forms symfony twig

我正在尝试将控制器嵌入到Twig模板中,如下所示:

{{ render(controller('IRCGlobalBundle:MailingList:join')) }}

此控制器呈现基本表单以加入邮件列表:

namespace IRC\GlobalBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use IRC\GlobalBundle\Entity\MailingList;
use IRC\GlobalBundle\Form\Type\MailingListType;

class MailingListController extends BaseController
{
    public function joinAction(Request $request) {
        $this->getSiteFromRequest($request);
        $mailingList = new MailingList;
        $mailingList->setSite($this->site);
        $form = $this->createForm(new MailingListType(), $mailingList);

        $form->handleRequest($request);

        if ($form->isSubmitted()) {
            echo "submitted form";
        } else {
            echo "unsubmitted form";
        }

        return $this->render('IRCGlobalBundle:Forms:join_mailing_list.html.twig', array(
            'form' => $form->createView(),
        ));
    }
}

问题是$ form-> isSubmitted()方法永远不会返回true,因此无法验证/处理表单提交。我究竟做错了什么?我是否需要将表单的目标更改为指向嵌入式控制器?

1 个答案:

答案 0 :(得分:2)

我猜它是因为表单会像<form action="">那样呈现,所以它会将信息发布到同一页面,但是因为你使用子请求渲染表单新的子请求不会携带任何表格数据。

解决此问题的最简单方法是通过黑客攻击表单操作属性并将其发送到joinAction,然后在处理完表单后,您可以redirectforward请求用户来自的页面。

这样的事情应该有效:

$form = $this->createForm(new MailingListType(), $mailingList, array(
     'action'   => //generate a url to joinAction
));