-1

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

请告诉我,我还剩下什么吗?

4

2 回答 2

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')改为将路由器注入的道具。

于 2019-02-19T09:18:55.333 回答
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')
);
于 2019-02-19T09:42:23.123 回答