2015-10-01 5 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 configの下部にプロバイダが追加されます。

さて、次へ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をレンダリング私たちがオーバーライドする必要があるバインディングが含まれているので役に立たない)。アルティザンに正しく解決されているバインディング

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

これは、オーバーライドされたキャッシュを持っているための唯一の方法のように思える:

は、だから私はNewServiceProviderCacheServiceProviderを拡張する必要があり、かつ配列はに変換プロバイダを持っているparent::register()を呼び出すことが義務です。