Twig使用render渲染子路由时控制器如何获取浏览器显示的主请求URL
实现方案
你遇到的是Symfony子请求场景下的请求隔离问题,通过{{ render() }}渲染的路由会触发独立的子请求,默认控制器只能拿到当前子请求的属性,要获取全局主请求的URL有两种常用方案:
方案1:通过RequestStack获取主请求(推荐)
Symfony核心的RequestStack服务存储了所有层级的请求实例,直接获取栈顶的主请求即可拿到地址栏完整URL:
- 在控制器中注入
RequestStack服务,调用getMainRequest()方法获取主请求实例
示例代码:
use Symfony\Component\HttpFoundation\RequestStack; class PluginTabsController extends AbstractController { public function loadTabs(RequestStack $requestStack) { // 获取全局主请求实例 $mainRequest = $requestStack->getMainRequest(); // 直接拿到浏览器地址栏显示的完整URL $fullCurrentUrl = $mainRequest->getUri(); // 附加常用获取项: // 仅获取路径部分(不含域名):$mainRequest->getPathInfo() // 获取原有的子路由名称:$requestStack->getCurrentRequest()->attributes->get('_route') } }
注意:Symfony 5.3之前的版本,
getMainRequest()方法名为getMasterRequest(),老版本项目替换方法名即可。
方案2:Twig渲染时传递主请求URL
如果不想在控制器中额外注入服务,也可以在渲染子路由时直接把主请求URL作为参数传递:
- 修改Twig中的渲染代码,把主请求URL作为参数传入子路由:
{{ render(path('plugintabs', { 'main_url': app.request.uri })) }}
- 控制器中直接接收参数使用即可:
public function loadTabs(string $main_url) { // $main_url 就是地址栏的完整URL }
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

