调用受保护的方法 Symfony\Bundle\FrameworkBundle\Controller\Controller::generateUrl()
Call to protected method 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')
更改为要将路由器注入的道具。
如果你只想在你的 Listener 中生成一个 url,你可以简单地注入路由组件给你 class :
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')
);
最近我正在将系统升级到 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')
更改为要将路由器注入的道具。
如果你只想在你的 Listener 中生成一个 url,你可以简单地注入路由组件给你 class :
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')
);