Laravel 5.1 自定义外观停止工作

Laravel 5.1 Custom Facade Stopped Working

我正在尝试为我的 Laravel 5.1.17 应用程序制作自定义 Facade。我一步一步地按照 Laravel documentation as well as this tutorial 进行操作,实际上我能够为我的自定义服务创建一个自定义 Facade。

然而,突然间它坏了。我收到的错误消息是:

FatalErrorException in Facade.php line 207:
Call to undefined method App\Facades\BookLookUp::test()

换句话说,我的 Facade 没有被绑定,相反 Laravel 正在我的中介 BookLookUp extends Facade class 中寻找 test() 方法,而不是我想要的服务 BookLookUp class.

非常奇怪的是,它工作得很好,然后就停止工作了。我所做的似乎让它崩溃的是我试图通过复制我的相关文件并只是切换名称来添加另一个 Facade,但不知何故我保持不变的原始 Facade 也停止工作了。

另一个相关的奇怪之处是我试图从头开始为我的 Facade 重新创建所有必要的文件并且它工作正常,像新的一样。然后我去重命名了 Facade 和相应的 classes/files,然后它又坏了。

因此,似乎以某种方式操纵文件夹会破坏某些东西,但这没有任何意义。我的 Facades 不再工作是否有原因?

以下是我的相关文件:

App/Services/BookLookUp.php

<?php

namespace App\Services;

class BookLookUp {
    public function test()
    {
        return "foo";
    }
}

App/Facades/BookLookUp.php

<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class BookLookUp extends Facade
{
    protected static function getFacadeAccessor() 
    { 
        return 'BookLookUp'; 
    }
}

App/Providers/BookLookUpServiceProvider.php

<?php

namespace App\Providers;

use App\Services\BookLookUp;
use Illuminate\Support\ServiceProvider;

class BookLookUpServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('BookLookUp', function() {
            return new BookLookUp();
        });
    }

     /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return ['App\Services\BookLookUp'];
    }
}

App/Http/Routes.php

<?php

Route::get('/', function() {
    return BookLookUp::test();
});

问题是我设置了 protected $defer = true; 但我的 provides() 方法没有 return 正确的值;相反,正确的 return 值将只是 return ['BookLookUp'],就像注册方法 return 是 BookLookUp.

至于为什么在操作文件时发生变化,这是由于composer。调用 composer update 时会重置绑定,因此在我操作任何文件之前,它从未被调用过,而且似乎在工作。一旦它被调用,它就会尝试注册我现在提供的绑定,除了我之前描述的方法中有错误,所以它永远无法正确定位我的 BookLookUp class.