2015-10-01 7 views
6

'da işe yaramaz Yeni bir Laravel yapısında, uygulamada her yerde çalışmak üzere geçersiz kılınmış IoC bağlamaları alamıyorum. Bir çekirdek sınıfı geçersiz kılan bir hizmet sağlayıcısı, örn. cache:Kademeli çekirdek sınıf, iş ortağı

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']; 
    } 
} 

sağlayıcı sonra app.providers yapılandırma altındaki eklenir.

Şimdi aşağıdaki routes.php değiştirmek ve sonucu kontrol gidin:

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

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

Ancak artisan tinker kadar yangın ve aynı şeyi: Aniden geçersiz kılma artık çalışmıyor

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

..

Olay dinleyicileri işlenirken aynı davranışla karşılaşılır ...

Bu normal davranış mıdır ve birşeye mi bakıyordum? Yoksa bu bir çeşit hata mı?

cevap

4

Sorunu kendim bulmayı başardım. Gördüğünüz gibi, cache.store bağlayıcı aramalar sonrasında CacheServiceProvider dahili ve dolayısıyla vermektedir bizim cache bağlayıcı

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

:

O Artisan yükleri tüm zamanlar anahtar sıralanmış sağlayıcıları dizisi kullanmada sağlayıcıları ertelenmiş görünüyor işe yaramazsa, geçersiz kılmamız gereken bağlamayı içerir). Artisan doğru çözümlenen bağlanma

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

Bu geçersiz kılınmış önbelleğe sahip için tek yol gibi görünüyor:

yüzden NewServiceProviderCacheServiceProvider uzatmak zorunda ve dizi dönüştürülen sağlayıcıları için parent::register() aramaya mecbur olduğum .