2017-06-26 100 views
0

出於好奇,我想知道爲什麼Http/Kernel-> sendRequestThroughRouter($ request)設置請求的實例,並立即擦除後。當Container :: clearResolvedInstance應該使用

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

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

這樣做的目的是什麼?

回答

0

,因爲它是registerd應用廣泛

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

後,其註冊在容器中,然後懸而未決的版本就打掉,因爲我理解

+0

對不起,你能解釋一下嗎?你提到「未解決的版本已被刪除」,奇怪的是該方法被稱爲「clearResolvedInstance」。請嘗試詳細說明您的答案。謝謝, –

+0

我不是親... https://laravel.com/docs/5.4/container檢查這個鏈接特別是綁定實例的一部分,其中明確指出,一個現有的對象被傳遞給容器,這是我猜的分辨率...所以它正在做的是獲得原始的HTTP請求,並將其綁定到應用程序容器,以便下一個可以使用說$ request-> has('some_thing')... –

+0

1.-您將請求對象綁定到容器。我明白了。那麼Facade :: clearResolvedInstance('request')究竟做了什麼?哪個實例清除了? –

0

看來,我終於得到了一點:

  • 外牆只是持有對位於容器中的實際服務實例的引用
  • 如果實例是重新引用通過$ app-> instance()或其他方式由新實例放置,然後由於門面引用仍指向先前刪除的實例,因此它已過時
  • 通過使用clearResolvedInstance清除Facade實例引用,它會強制外觀在下次通過resolveFacadeInstance($ name)調用外觀時存儲新引用

我是否正確?

這就引出了另一個問題:

什麼是管理和恢復這些resolvedInstances點:

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

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

而不是僅僅總是直接從容器返回實例是這樣的:

return static::$app[$name]; 
相關問題