2015-10-01 24 views
6

在新的Laravel構建中,我無法重寫IoC綁定以在應用程序中的任何地方工作。在技術人員手中時,被覆蓋的核心類不工作

假設一個覆蓋核心類的服務提供者,例如緩存:

class NewServiceProvider extends ServiceProvider 
{ 
    protected $defer = true; 

    public function register() 
    { 
     $this->app->singleton('cache', function($app) { 
      return new \stdClass; // demo purpose 
     }); 
    } 

    public function provides() 
     { 
     return ['cache']; 
    } 
} 

提供商然後在app.providers配置的底部加入。

現在修改routes.php下面去檢查結果:

Route::get('/', function() { 
    dd(app('cache')); 
}); 

// Results in an empty stdClass being shown. It works! 

然而,火起來artisan tinker,做同樣的:

$ php artisan tinker 
>>> app('cache') 
=> Illuminate\Cache\CacheManager 

突然倍率不工作了..

處理事件偵聽器時遇到同樣的行爲...

這是正常的行爲,我可以忽略一些東西嗎?或者這是一種錯誤?

回答

4

我設法自己追蹤了這個問題。

似乎工匠負荷都在使用一鍵排序提供商陣列一次延期提供商:

... 
"cache" => NewServiceProvider, 
"cache.store" => CacheServiceProvider, 
... 

正如你所看到的,cache.store綁定調用內置CacheServiceProvider之後,因此呈現 我們cache結合因爲它包含我們需要覆蓋的綁定)。

所以我有義務爲NewServiceProvider延長CacheServiceProvider,並呼籲parent::register()有供應商陣列轉換爲:

... 
"cache" => NewServiceProvider, 
"cache.store" => NewServiceProvider, 
... 

這似乎是有覆蓋的高速緩存的唯一方法結合正在工匠正確解析。