如何避免在 silex 应用程序中超出请求范围异常?

How to avoid outside of request scope exception in silex application?

重构我的 silex1.2 应用程序后,我现在遇到了以下问题:

exception 'RuntimeException' with message 'Accessed request service outside of request scope. Try moving that call to a before handler or controller.' in ../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'] 超出了范围。

我不明白错误信息,如:

基本上,我想尽早访问请求数据以获得一个值。我怎样才能做到这一点,以便 bootstrap 相应地申请?

你在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']