调用受保护的方法Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller :: generateUrl()

时间:2019-02-19 09:04:23

标签: php symfony symfony4 php-7.1 symfony-4.2

最近我将系统升级到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'));

请让我知道,我还剩下什么。

2 个答案:

答案 0 :(得分:2)

您正在尝试从侦听器调用控制器帮助器方法。正如@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')更改为将路由器注入的道具。

答案 1 :(得分:0)

如果只想在监听器中生成一个url,则只需将路由器组件注入到您的类中:

private $router;

public function __construct(UrlGeneratorInterface $router)
{
    $this->router = $router;
}

...

// Use it like this

$url = $this->router->generate(
    $event->getRequest()->get('_route'),
    $event->getRequest()->get('_route_params')
);