Как внедрить @request_stack или @request в слушатель

У меня есть этот слушатель:

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpFoundation\Request;

class ControllerListener
{
public function onKernelController( FilterControllerEvent $event, Request $request )
{
if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
$controllers = $event->getController();
if (is_array( $controllers )) {
$controller = $controllers[0];
if (is_object( $controller )) {
if (method_exists( $controller, 'parControl' )) {
$controller->parControl(
$controller->getRequest(),
$controller->getRequest()->get( 'action' ),
$controller->getRequest()->get( 'context' ),
$controller->getRequest()->get( 'page' ),
$controller->getRequest()->get( 'case' ),
$controller->getRequest()->get( 'subset' )
);
}

if (method_exists( $controller, 'adminProjectControl' )) {
// to this method I need to pass Request $request
$controller->adminProjectControl($request);
}

if (method_exists( $controller, 'accessControl' )) {
$controller->accessControl();
}
}
}
}
}

public function onKernelResponse( FilterResponseEvent $event )
{
Utilities::flashDebugLoginMessage();
}
}

И это определяется как услуга в services.yml:

pdone.listener.preexecute:
class: GroupDCA\PDOneBundle\Listener\ControllerListener
arguments: [@request]
public: true
scope: request
tags:
- { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
- { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }

Но я должен сделать что-то не так, так как я получил эти три ошибки:

ContextErrorException в ControllerListener.php строка 12: Catchable
Фатальная ошибка: аргумент 2 передан
GroupDCA \ PDOneBundle \ Слушатель \ ControllerListener :: onKernelController ()
должен быть экземпляром Symfony \ Component \ HttpFoundation \ Request,
заданная строка

ContextErrorException в ControllerListener.php строка 12: Catchable
Фатальная ошибка: аргумент 2 передан
GroupDCA \ PDOneBundle \ Слушатель \ ControllerListener :: onKernelController ()
должен быть экземпляром Symfony \ Component \ HttpFoundation \ Request,
заданная строка

LogicException в строке 3118 bootstrap.php.cache: нет слушателей
Событие «kernel.exception» устанавливает ответ

Итак, как мне ввести запрос к слушателю? Могу ли я сделать это? Я также прочитал этот пост здесь, но не понимаю, как это сделать.

0

Решение

FilterControllerEvent уже дает вам доступ к запросу:

public function onKernelController(FilterControllerEvent $event)
{
$request = $event->getRequest();

// ...
}

Если вам нужен запрос в слушателях, где событие не предоставляет запрос, всегда используйте стек запросов:

use Symfony\Component\HttpFoundation\RequestStack;

class MyService
{
private $requestStack;

public function __construct(RequestStack $requestStack)
{
$this->requestStack = $requestStack;
}

public function doSomething()
{
$request = $this->requestStack->getCurrentRequest();

// ...
}
}

Внедрение запроса не рекомендуется и будет удалено. Стек запросов — это путь. Не используйте request сфера либо.

11

Другие решения

Вы передаете объект запроса в конструктор ControllerListener из определения службы, а не в метод onKernelController.

Вместо этого сделайте:

protected $request;

public function __construct (Request $request) {

$this->request = $request;
}

Что должно решить вашу проблему и сделать объект запроса доступным.

0

По вопросам рекламы [email protected]