1

我在应用程序中使用这个包。控制器是显示搜索表单、获取响应并对其进行处理的典型控制器(示例):

public function indexAction()
{
    $request = $this->getRequest();

    $example = new Example();

    $form = $this->createForm(new ExampleFindType(), $example, array(
            'action' => $this->generateUrl('example_find'),
            'method' => 'POST',
    ));

    $form->handleRequest($request);

    if ($form->isValid())
    {
        $em = $this->getDoctrine()->getManager();

        $examples = $em->getRepository('ApplicationExampleBundle:Example')
            ->find_by_fields($example);

        $paginator  = $this->get('knp_paginator');              

        $pagination = $paginator->paginate(
                $examples,
                $this->get('request')->query->get('p', 1),
                20
        );

        return $this->render('ApplicationExampleBundle:Default:searchResults.html.twig',
                array('pagination' => $pagination));
    }

    return $this->render('ApplicationExampleBundle:Default:index.html.twig',
            array('form' => $form->createView(),
            ));
}

当我执行搜索时,我正确地看到了结果列表和分页器。当我按到下一页的链接时出现问题。链接 ID 生成良好,URL 以“?p=2”结尾,但似乎没有重新发送表单 POST 数据,因为它将我发送到搜索表单页面($form->isValid() 为 false)。

如果我将表单方法从 POST 更改为 GET 并在 URL 中传递参数:

$form = $this->createForm(new ExampleFindType(), $example, array(
           'action' => $this->generateUrl('example_find'),
           'method' => 'GET',
));

分页器工作完美。

难道我做错了什么?可以使用 POST 表单吗?

我已经搜索了一个答案,但是我看到的所有 KnpPagintor 控制器示例都没有生成带有表单的查询,而且这个问题对我没有帮助。

谢谢。

4

1 回答 1

4

您不应该使用 POST 方法来获取数据。

否则,如果您需要使用POST方法,那么您需要会话中的数据。然而,很难建立良好的用户体验,而使用GET方法更有意义。

您可以在 MDN 上找到有关 HTTP 的大量文档

  • 请求数据时应使用GET方法。
  • 当您保存数据(如将评论保存到数据库中)或其他数据操作时,应使用POST方法。

Google在自己的搜索页面上使用GET 。

https://www.google.com/#q=symfony&start=10

q是我搜索的内容,并且start是分页器值。他们可能使用偏移量而不是页码来避免计算偏移量(更快且更便宜)。

于 2014-02-03T23:46:38.553 回答