如何在KnpPaginatorBundle中使用友好的URL

4

我在我的Symfony 2.1项目中安装了KnpPaginatorBundle,并配置了分页器。

使用分页器后,我的URL看起来像:

http://dev.localhost/app_dev.php/news/development?page=3

是否可以将URL更改为像这样(或类似的 - 没有?和=字符)?

http://dev.localhost/app_dev.php/news/development/page/3
2个回答

8
我找到了解决方案,要解决您的问题,请按照以下步骤操作:
1)创建一个新路线或更改旧路线,在routing.yml中添加以下内容:
news_development_route:
    pattern: /news/development/{page}
    defaults: {_controller: AcmeMainBundle:Article:list, page: 1 }

在你的班级控制器中,将你的方法改成这样:
// Acme\MainBundle\Controller\ArticleController.php

public function listAction($page)/*add the $page param*/
{
    $em    = $this->get('doctrine.orm.entity_manager');
    $dql   = "SELECT a FROM AcmeMainBundle:Article a";
    $query = $em->createQuery($dql);

    $paginator  = $this->get('knp_paginator');
    $pagination = $paginator->paginate(
        $query,
        $this->get('request')->query->get('page', $page)/*change the number 1 by the $page parameter*/,
        10/*limit per page*/
    );
    $pagination->setUsedRoute('news_development_route'); /*define the pagination route*/

    // parameters to template
    return $this->render('AcmeMainBundle:Article:list.html.twig', array('pagination' => $pagination));
}

这就是它。

1
两年后。谢谢。我已经测试过了,它的运行非常顺畅。 - repincln
如果您在路由中使用变量(例如 @Route("/list/{name}", name="_article_list")),则可以使用 $pagination->addParam('name', 'Finance'); 将它们添加进去。我仍在寻找如何以干净的 URL 开始(因此取消所有当前查询字符串参数)。 - rolandow

2
在您的控制器中,您需要更改以下内容:
/**
 * @Route("/list/", name="_user_list")
 * @Template()
 */
public function listAction()
{
    $em = $this->get('doctrine.orm.entity_manager');
    $dql = "SELECT a FROM HPPTarjetaBundle:User a";
    $query = $em->createQuery($dql);

    $paginator = $this->get('knp_paginator');
    $pagination = $paginator->paginate(
        $query,
        $this->get('request')->query->get('page', 1)/*page number*/,
        10/*limit per page*/
    );
    return compact('pagination');
}

... 转换为以下形式(请参阅“页面”参数):

/**
 * @Route("/list/{page}", name="_user_list")
 * @Template()
 */
public function listAction($page)
{
    $em = $this->get('doctrine.orm.entity_manager');
    $dql = "SELECT a FROM HPPTarjetaBundle:User a";
    $query = $em->createQuery($dql);

    $paginator = $this->get('knp_paginator');
    $pagination = $paginator->paginate(
        $query,
        $page/*page number*/,
        10/*limit per page*/
    );
    return compact('pagination');
}

我遇到了一个问题,因为参数没有默认值,但是添加defaults={"page" = 1}解决了它。 - dextervip
如果你采用 @DrMartin 的解决方案,你需要指定查询字符串。我是这样解决的:<a href="{{ path('my_rute') ~ "/" ~ myObject.Id}}">Details</a>。"~"非常有用。请参阅Twig官方书籍:http://twig.sensiolabs.org/pdf/Twig.pdf‎,章节:Twig模板设计师/表达式。祝好运。 - Felix Aballi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接