Symfony - исключение при попытке использовать ControllerResolver - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь использовать ControllerResolver , чтобы получить класс контроллера и что-то делать в приемнике событий kernel.request, но мой код выдает исключение, когда контроллер представлен как служба (например, fos_user.security.controller).Это происходит как в Symfony 3.4, так и в 4.1.

Так что это мой код, ничего особенного ..

public function onKernelRequest(GetResponseEvent $event)
{
    if (!$event->isMasterRequest()) return;
    $cr = new ControllerResolver();
    $request = $event->getRequest();
    $controller = $cr->getController($request);
    ...
}

, и исключение выдается, как только я звоню $cr->getController($request).


Symfony 3.4

Итак, я начал играть с отладчиком и обнаружил, что исключение выдается в ControllerResolver->createController($controller)

protected function createController($controller)
{
    if (false === strpos($controller, '::')) {
        throw new \InvalidArgumentException(sprintf('Unable to find controller "%s".', $controller));
    }
    ...
}

На самом деле контроллер можно найти вRequest->attributes->get('_controller') обычно форматируется как Class::Function:

Метод getController () основан на том же соглашении, которое мы определили ранее: атрибут запроса _controller должен содержать контроллер, связанный с запросом.Помимо встроенных обратных вызовов PHP, getController () также поддерживает строки, состоящие из имени класса, за которым следуют две двоеточия, и имени метода в качестве допустимого обратного вызова, например «class :: method»

Однако дляВ некоторых контроллерах (например, FOS\UserBundle\Controller\SecurityController) используется относительный идентификатор услуги (т. е. fos_user.security.controller), а атрибут _controller форматируется по-разному с использованием Service:function (обратите внимание только на один :).Поэтому ясно, что в createController().


Symfony 4.1

будет выдано исключение. Даже если класс ControllerResolver имеет немного другую реализацию в 4.1, исключениеброшен в той же ситуации.На самом деле в этой версии атрибут _controller в Запросе ВСЕГДА отформатирован как Class::Function, даже если класс является идентификатором службы:

// $class will be 'fos_user.security.controller'
list($class, $method) = explode('::', $controller, 2);

    try {
        return array($this->instantiateController($class), $method);
        ...

, а затем возникает исключение

protected function instantiateController($class)
{
    return new $class();
}

поскольку new fos_user.security.controller() явно приводит к

Попытка загрузить класс "fos_user.security.controller" из глобального пространства имен.Вы забыли выражение "use"?


Теперь кажется довольно странным, что никто не заметил эту ошибку даже потому, что, согласно документации

... inSymfony, getController () улучшен для поддержки контроллеров как сервисов ...

Итак, я что-то упустил или этот компонент действительно содержит ошибки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...