Symfony 6:使用动态部件创建动作路线

nnt7mjpx  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(107)

我在我的项目中有一个基于Symfony 6.3的控制器操作:

#[Route('/test')]
class TestController extends AbstractController
{
    #[Route('/events/page/{page<\d+>?1}/itemsPerPage/{itemsPerPage<\d+>?10}', name: 'get_events')]
    public function getEvents(PaginatorInterface $paginator, int $page = 1, int $itemsPerPage = 10)
    {
    // ...
    }
}

这个操作使用KnpPaginatorBundle来对找到的事件进行分页,这就是为什么我需要pageitemsPerPage参数。当我这样调用我的操作时,一切都很好:

http://127.0.0.1:8080/test/events/page/1/itemsPerPage/7

我想要的是使/page//itemsPerPage/ URL部分也是动态的。我的意思是:

  • 如果我省略了itemsPerPage参数(http://127.0.0.1:8080/test/events/page/1),路由应该保持有效,并使用默认的itemsPerPage值(10)。请注意,在URL中不仅没有7,而且整个部分-/itemsPerPage/7(动态7和“静态”/itemsPerPage/);
  • 如果我省略了page参数(http://127.0.0.1:8080/test/events/itemsPerPage/7),路由应该保持有效,并使用默认的page值(1)。请注意,URL中不仅没有1,而且整个部分-/page/1(动态1和“静态”/page/);
  • http://127.0.0.1:8080/test/events/page/1/itemsPerPage/7应该仍然有效(传递两个参数)。

我意识到,拒绝使用“静态”部件并这样做可能更容易:

#[Route('/events/{page<\d+>?1}/{itemsPerPage<\d+>?10}', name: 'get_events')]

但是我计划在将来添加更多的GET参数,所以我不希望我的URL最终看起来像http://127.0.0.1:8080/test/events/1/7/100/8648/78978/...(除非这是唯一可能的解决方案)。
我也可以尝试这样做,以涵盖所有可能的情况:

#[Route('/events/page/{page<\d+>?1}/itemsPerPage/{itemsPerPage<\d+>?10}')]
#[Route('/events/itemsPerPage/{itemsPerPage<\d+>?10}/page/{page<\d+>?1}')]
#[Route('/events/itemsPerPage/{itemsPerPage<\d+>?10}')]
#[Route('/events/page/{page<\d+>?1}')]

但是正如我上面所说的,额外的GET参数将在后面出现,所以这种组合不是一种选择,因为可能的情况很多。
Symfony是否提供了处理这种情况的可能性?

hmmo2u0o

hmmo2u0o1#

在Route中,我只会添加页面无法工作的变量。例如,如果页面列出了用户事件,那么我会在Route中添加user_id。您可以从knp_paginator configuration yamlgetsession获取其他所有内容,并在控制器中处理它们。
在您当前的情况下,我将使用$_GETpageitemsPerPage存储在会话变量中,然后从会话访问它们,验证它们,然后像这样传递它们:

$pagination = $paginator->paginate(
        $queryBuilder, /* query NOT result */
        $page,
        $itemsPerPage
    );

这样你就可以有一个干净的url,并且可以灵活地在将来添加更多的参数。

相关问题