何时应使用Container :: clearResolvedInstance

时间:2017-06-26 18:08:53

标签: laravel

出于好奇,我想知道为什么Http / Kernel-> sendRequestThroughRouter($ request)设置了一个请求实例,并立即擦除它。

protected function sendRequestThroughRouter($request)
{
    $this->app->instance('request', $request);

    Facade::clearResolvedInstance('request');
...

这样做的目的是什么?

2 个答案:

答案 0 :(得分:0)

因为它是appwide注册的

/**
     * Register an existing instance as shared in the container.
     *
     * @param  string  $abstract
     * @param  mixed   $instance
     * @return void
     */
    public function instance($abstract, $instance);

在容器中注册后,就我理解

而擦除未解析的版本

答案 1 :(得分:0)

似乎我终于明白了这一点:

  • Facades只保存对位于Container
  • 中的实际服务实例的引用
  • 如果通过$ app-> instance()或其他方式将实例替换为新实例,则Facade引用将变得过时,因为它仍然指向上一个已删除的实例
  • 通过clearResolvedInstance清除外观实例引用,它会强制外观在下次通过resolveFacadeInstance($ name)调用外观时存储新引用

我做对了吗?

这引出了另一个问题:

管理和返回这些已解决的实例有什么意义:

if (isset(static::$resolvedInstance[$name])) {
        return static::$resolvedInstance[$name];
    }

return static::$resolvedInstance[$name] = static::$app[$name];

而不是总是直接从Container返回实例,如下所示:

return static::$app[$name];