Вызов защищенного метода 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'));
Пожалуйста, дайте мне знать, есть что-нибудь, что я оставил.
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')
в опору, в которую вы вводите роутер.
Если вы просто хотите сгенерировать 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')
);