Как избежать исключения за пределами области запроса в приложении silex?

После реструктуризации моего приложения silex1.2 я столкнулся с:

исключение «RuntimeException» с сообщением «Доступ к службе запросов за пределами области запроса». Попробуйте переместить этот вызов в обработчик перед или контроллер. в ../vendor/silex/silex/src/Silex/Application.php:150

Раньше я настраивал конфигурацию приложения следующим образом:

$app = new Silex\Application();
$app->register(new ServiceControllerServiceProvider());
$app->register(new ConfigServiceProvider($configFile));
$fileFinder = new \Symfony\Component\Finder\Finder();
foreach ($fileFinder->in($configPath . 'country') as $file) {
   /* @var SplFileInfo $file */
    $app->register(new ConfigServiceProvider($file->getRealPath()));
}

Теперь я хотел заменить цикл foreach, введя определенное значение, которое я получаю из запроса пользователя. Итак, я хотел получить доступ к $request->query->get('country'); но я не могу, так как app['request'] в этот момент выходит за рамки.

Я не понимаю сообщение об ошибке, например:

  • Когда и почему объекты запросов выходят за рамки в silex?
  • Как я должен переместить вызов перед обработчиком и контроллерами, если это самое первое, что я делаю при настройке своего приложения?

По сути, я хочу получить доступ к данным запроса на ранней стадии, чтобы получить одно значение. Как я могу добиться этого, чтобы соответствующим образом загрузить приложение?


person k0pernikus    schedule 10.02.2016    source источник


Ответы (1)


Вы пытаетесь использовать Request до его инициализации, до $app->run().
Вы можете вручную инициализировать Request:

$app = new \Silex\Application();
$app['request'] = \Symfony\Component\HttpFoundation\Request::createFromGlobals();
.....
$app->run($app['request']);

или сделать ленивую загрузку в сервис-провайдерах:

$app['object1'] = $app->share(function ($app) {
    return new Object1($app['request']->query->get('country'));
});
...

и где-то в контроллере получить эту переменную как $app['object1']

person Max P.    schedule 11.02.2016
comment
Страшно то, что моя текущая сессия отладки только что привела меня к такому же выводу, и я собирался написать то же самое. :D - person k0pernikus; 11.02.2016
comment
Кажется, что-то не так. Request::createFromGlobals создает объект запроса, но не имеет параметров GET. - person k0pernikus; 11.02.2016
comment
Вы имеете в виду параметры из маршрута? Если да, то они устанавливаются в $app->run() на KernelEvents::REQUEST событии. Попробуйте использовать $app->share(..) для определения правильных объектов в поставщике услуг. Или опишите, как вы используете $request->query->get('country') при инициализации поставщика услуг. - person Max P.; 11.02.2016
comment
Я думаю, это связано с моей архитектурой и тем, как функциональный тест настраивает приложение silex. У функционального теста нет запроса при сборке приложения, но он запрашивается при обычном запросе приложения. В функциональном тесте запрос запускается после того, как приложение уже неявно построено, предполагая, что запрос не нужен на уровне начальной загрузки. - person k0pernikus; 11.02.2016