我在我的项目中有一个基于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来对找到的事件进行分页,这就是为什么我需要page
和itemsPerPage
参数。当我这样调用我的操作时,一切都很好:
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是否提供了处理这种情况的可能性?
1条答案
按热度按时间hmmo2u0o1#
在Route中,我只会添加页面无法工作的变量。例如,如果页面列出了用户事件,那么我会在Route中添加user_id。您可以从
knp_paginator configuration yaml
或get
或session
获取其他所有内容,并在控制器中处理它们。在您当前的情况下,我将使用
$_GET
将page
和itemsPerPage
存储在会话变量中,然后从会话访问它们,验证它们,然后像这样传递它们:这样你就可以有一个干净的url,并且可以灵活地在将来添加更多的参数。