【问题标题】:Call to protected method Symfony\Bundle\FrameworkBundle\Controller\Controller::generateUrl()调用受保护的方法 Symfony\Bundle\FrameworkBundle\Controller\Controller::generateUrl()
【发布时间】:2019-07-12 17:27:24
【问题描述】:

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

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

【问题讨论】:

  • 受保护的方法仅在类实例中可见,这意味着您不能从类外部使用它们。可以将它们与反射一起使用,但不建议这样做。
  • $controller的内容是什么?
  • 如果你扩展类你可以使用它,但它应该用方法扩展类。
  • SecurityListener.php on line 45: array:2 [▼ 0 => AcmeController {#583 ▼ -country_name: array:249 [▶] +email_sender: array:1 [▶] #container: appAppKernelDevDebugContainer {#460 …20} } 1 => "acmeAction" ] 这是控制器 @D4V1D 的内容
  • @ArtisticPhoenix 我确实找到了网址api.symfony.com/master/Symfony/Bundle/FrameworkBundle/…,但无法扩展特征。请检查。

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


【解决方案1】:

您正在尝试从侦听器调用控制器辅助方法。正如@ArtisticPhoenix 在 cmets 中所说,这是不允许的。你可以在这里做的是重写你的监听器,而不是使用控制器的方法(它只是为了你的操作的帮助),而是生成 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') 更改为您要注入路由器的道具。

【讨论】:

    【解决方案2】:

    如果你只想在你的监听器中生成一个 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')
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 2018-10-03
      • 2023-02-09
      • 2011-08-07
      • 2019-10-08
      相关资源
      最近更新 更多