Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在artisan中时,重写的核心类不起作用_Php_Laravel_Laravel 5_Inversion Of Control - Fatal编程技术网

Php 在artisan中时,重写的核心类不起作用

Php 在artisan中时,重写的核心类不起作用,php,laravel,laravel-5,inversion-of-control,Php,Laravel,Laravel 5,Inversion Of Control,在新的Laravel构建中,我无法使覆盖的IoC绑定在应用程序中的任何地方都能工作 假设覆盖核心类(例如缓存)的服务提供商: class NewServiceProvider extends ServiceProvider { protected $defer = true; public function register() { $this->app->singleton('cache', function($app) {

在新的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
突然,超控装置不再工作了

处理事件侦听器时遇到相同的行为


这是正常的行为吗?我是否忽略了什么?或者这是某种bug?

我自己设法找到了这个问题

Artisan似乎使用键排序提供程序数组一次加载所有延迟提供程序:

...
"cache" => NewServiceProvider,
"cache.store" => CacheServiceProvider,
...
如您所见,
cache.store
绑定随后调用内置的
CacheServiceProvider
,从而呈现 我们的
缓存
绑定无效,因为它包含我们需要覆盖的绑定)

因此,我必须让
NewServiceProvider
扩展
CacheServiceProvider
,并调用
parent::register()
将providers数组转换为:

...
"cache" => NewServiceProvider,
"cache.store" => NewServiceProvider,
...
这似乎是在Artisan中正确解析重写的缓存绑定的唯一方法