2015-10-01 36 views
6

W świeżej kompilacji Laravel, nie mogę przesłonić wiązań IoC do pracy wszędzie w aplikacji.Zastępowana klasa podstawowa nie działa, gdy w rzemiośle

Załóżmy, że dostawca usług zastępuje klasę podstawową, np. cache:

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

Operator dodaje się następnie na dole app.providers config.

teraz modyfikować routes.php na następujące kwestie i iść sprawdzić wynik:

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

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

jednak odpalić artisan tinker i zrobić to samo:

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

Nagle korekcja nie działa już ..

To samo zachowanie występuje podczas przetwarzania detektorów zdarzeń ...

Czy to normalne zachowanie i czy coś przeoczyłem? Czy to jakiś błąd?

Odpowiedz

4

Udało mi się samemu ustalić przyczynę.

Wydaje Artisan ładuje wszystkie odroczone dostawców naraz używając klucza posortowane dostawcom tablicy:

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

Jak widać, wywołania wiążących cache.store wbudowanej CacheServiceProvider potem i stąd świadczy naszych cache wiążący bezużyteczne, ponieważ zawiera wiązanie, które musimy zastąpić).

Więc jestem zobowiązany do posiadania NewServiceProvider przedłużyć CacheServiceProvider i wywołać parent::register() mieć dostawców tablica zamienione na:

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

To wydaje się jedynym sposobem, aby mieć zastąpiona cache wiązanie jest rozwiązane poprawnie w Artisan .