2015-10-01 19 views
6

In una nuova versione di Laravel, non riesco a evitare che i collegamenti IoC sottoposti a override funzionino ovunque nell'applicazione.La classe principale sottoposta a override non funziona quando si lavora nell'artigiano

Supponiamo che un fornitore di servizi sostituisca una classe principale, ad es. 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']; 
    } 
} 

Il provider viene poi aggiunto in fondo app.providers config.

Ora modificare routes.php al seguente e andare a controllare il risultato:

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

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

Tuttavia, accendere artisan tinker e fare lo stesso:

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

Improvvisamente l'override non funziona più ..

Lo stesso comportamento si verifica durante l'elaborazione dei listener di eventi ...

È questo comportamento normale e sto trascurando qualcosa? O è una specie di bug?

risposta

4

Sono riuscito a rintracciare il problema da solo.

Sembra carichi Artisan tutti i fornitori di differiti contemporaneamente utilizzando una chiave-ordinato fornitori di array:

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

Come si può vedere, le cache.store chiamate legame vincolante il built-in CacheServiceProvider dopo e di conseguenza rende nostro cache inutile dal momento che contiene l'associazione che dobbiamo scavalcare).

Quindi sono obbligati ad avere NewServiceProvider estendere CacheServiceProvider, e chiamare parent::register() di avere i fornitori di matrice convertito in:

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

Questo mi sembra l'unico modo per avere la cache override legame risolversi correttamente in Artisan .