php - 调用受保护的方法 Symfony\Bundle\FrameworkBundle\Controller\Controller::generateUrl()
问题描述
最近我将系统升级到 Symfony 4.2,在我的一个页面中,我遇到了错误说
Call to protected method Symfony\Bundle\FrameworkBundle\Controller\Controller::generateUrl() from context 'Acme\Bundle\Security\Listener\SecurityListener'
显示错误的行:
$this_url = $controller[0]->generateUrl($event->getRequest()->get('_route'), $event->getRequest()->get('_route_params'));
请告诉我,我还剩下什么吗?
解决方案
您正在尝试从侦听器调用控制器辅助方法。正如@ArtisticPhoenix 在评论中所说,这是不允许的。你可以在这里做的是重写你的监听器,而不是使用控制器的方法(它只是为了你的操作的帮助),而是生成 URL 的实际路由器方法。看看Controller
(或ControllerTrait
取决于您的 Symfony 版本)。该generateUrl()
方法调用@router
服务:
/**
* Generates a URL from the given parameters.
*
* @see UrlGeneratorInterface
*
* @final
*/
protected function generateUrl(string $route, array $parameters = [], int $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH): string
{
return $this->container->get('router')->generate($route, $parameters, $referenceType);
}
这就是您实际上必须使用的,而不是调用控制器的方法。你可以尝试这样的事情:
$this_url = $this->container->get('router')->generate($event->getRequest()->get('_route'), $event->getRequest()->get('_route_params'));
虽然,您必须确保您有可用的容器(这通常不是一个好的模式),或者您将其Router
作为依赖项传递到您的服务中。这样,您将更$this->container->get('router')
改为将路由器注入的道具。
推荐阅读
- python - 使用python将HTML代码导入CSV
- integration - Activiti 框架和 teradata 兼容性
- html - 如果没有要显示的对象数据,如何在 Jinja (flask) 中显示消息
- python - 如何根据python中其他列的信息/条件将字符串放入新列
- java - 如何将 HTTP 响应作为字符串转换为数组?
- java - java.lang.NoSuchMethodError:使用詹金斯共享库时,在步骤中找不到这样的 DSL 方法“ci”
- javascript - 如何在使用事件侦听器单击特定 div 时隐藏它?
- javascript - 如何在jquery中使用数据属性隐藏tr
- python - 在python的for循环中合并数据帧
- javascript - 如何通过 Flask 重定向到 Vue-app 的特定页面