Вызов защищенного метода Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller :: generateUrl () - PullRequest
0 голосов
/ 19 февраля 2019

Недавно я обновлял систему до 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 голосов
/ 19 февраля 2019

Если вы просто хотите сгенерировать 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')
);
0 голосов
/ 19 февраля 2019

Вы пытаетесь вызвать вспомогательный метод контроллера из слушателя.Как сказал @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') на опору, в которую вы вводите маршрутизатор.

...