如何避免在 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']
超出了范围。
我不明白错误信息,如:
- 请求对象何时以及为何超出 silex 的范围?
- 当我在设置我的应用程序时做的第一件事是在处理程序和控制器之前移动调用?
基本上,我想尽早访问请求数据以获得一个值。我怎样才能做到这一点,以便 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']
重构我的 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']
超出了范围。
我不明白错误信息,如:
- 请求对象何时以及为何超出 silex 的范围?
- 当我在设置我的应用程序时做的第一件事是在处理程序和控制器之前移动调用?
基本上,我想尽早访问请求数据以获得一个值。我怎样才能做到这一点,以便 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']