Symfony 2 - 布局嵌入“无实体/类表单”验证不起作用


Symfony 2 - Layout embed "no entity/class form" validation isn't working

我正在用symfony开发一个博客,但我被嵌入在布局中的表单所困扰。就我而言,一个简单的搜索表单。

<div class="b-header-block m-search">
    {{ render(controller('YagoQuinoySimpleBlogBundle:Blog:searchArticles')) }}
</div>

为了呈现表单,我在布局树枝文件中使用嵌入控制器。

public function searchArticlesAction(Request $request)
{
    $form = $this->createForm(new SearchArticlesType());
    $form->handleRequest($request);
    if ($form->isValid()) {
        // Do stuff here
    }
    return $this->render('YagoQuinoySimpleBlogBundle:Blog:searchArticles.html.twig', array(
                'form' => $form->createView()
    ));
}

indexAction 是检索表单数据并过滤文章列表的函数。

public function indexAction(Request $request)
{
    $form = $this->createForm(new SearchArticlesType());
    $form->handleRequest($request);
    if ($form->isValid()) {
        $data = $form->getData();
        $criteria = array(
            'title' => $data['search']
        );
    } else {
        $criteria = array();
    }
    $articles = $this->getDoctrine()->getRepository('YagoQuinoySimpleBlogBundle:Article')->findBy($criteria, array(
        'createDateTime' => 'DESC'
            ), 5);
    return $this->render('YagoQuinoySimpleBlogBundle:Blog:index.html.twig', array('articles' => $articles));
}

搜索文章类型是一个表单类

class SearchArticlesType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('search', 'text', array(
            'constraints' => new NotBlank()
        ))
                ->add('submit', 'submit', array(
                    'label' => 'Buscar'
        ));
    }
    public function getName()
    {
        return 'searchArticles';
    }
}

当我提交此表格时,问题就来了。indexAction 尽自己的一份力量,验证表单并过滤文章,但当嵌入控制器尝试验证数据(仅用于显示信息或其他内容)时

$form->handleRequest($request);
if ($form->isValid()) {
    // Do stuff here
}

我觉得我错过了什么。

感谢您的帮助!

当你调用render(controller('your_route'))时,你实际上是在发出一个子请求,这意味着参数包被清空,所以你的请求不会被表单"处理"。

如果您使用的是 2.4+,则可以使用 .. 从请求堆栈获取主请求。

/** @var 'Symfony'Component'HttpFoundation'RequestStack $requestStack */
$requestStack = $this->get('request_stack');
$masterRequest = $requestStack->getMasterRequest();

然后你可以在渲染的控制器中处理该请求,而不是当前(子)请求,例如..

$form->handleRequest($masterRequest);

在你的: public function searchArticlesAction(Request $request) 你缺少创建表单上的第二个参数

$searchArticle = new SearchArticle(); // I assume this is how you named the Entity, if not just change the entity name
$form = $this->createForm(new SearchArticlesType(), $article);