【问题标题】:How to avoid outside of request scope exception in silex application?如何避免 silex 应用程序中的请求范围之外的异常?
【发布时间】:2016-02-10 18:43:25
【问题描述】:

重组我的 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 的范围?
  • 我应该如何将调用移到处理程序和控制器之前,这是我设置应用程序时要做的第一件事?

基本上,我想尽早访问请求数据以获得一个值。为了相应地引导应用程序,我怎样才能做到这一点?

【问题讨论】:

    标签: php request silex


    【解决方案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']

    【讨论】:

    • 可怕的是,我当前的调试会话刚刚让我得出了相同的结论,而我正要写同样的东西。 :D
    • 好像出了点问题。 Request::createFromGlobals 创建一个请求对象,但它没有 GET 参数。
    • 你的意思是来自路由的参数吗?如果是这样,它们在KernelEvents::REQUEST 事件中设置在$app->run() 中。尝试使用$app->share(..) 在服务提供者中定义适当的对象。或者描述一下如何在服务提供者初始化中使用$request->query->get('country')
    • 我认为这与我的架构以及功能测试如何设置 silex 应用程序有关。功能测试在构建应用程序时没有请求,但在“正常方式”请求应用程序时它会请求。在功能测试中,假设在引导级别不需要请求,则在应用程序已经隐式构建后触发请求。
    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多