我正在尝试为我的Laravel 5.1.17应用程序制作自定义立面。我一步一步地遵循了Laravel文档和本教程,并且确实能够为我的自定义服务创建自定义Facade。
然而,它突然断了。我得到的错误信息是:
FatalErrorException in Facade.php line 207:
Call to undefined method App'Facades'BookLookUp::test()
换句话说,我的Facade没有被绑定,而Laravel正在寻找我的中间BookLookUp extends Facade
类中的test()
方法,而不是我预期的服务BookLookUp
类。
很奇怪的是,它本来工作得很好,然后它就停止工作了。我所做的似乎使它破裂的是,我试图通过复制我的相关文件并切换名称来添加另一个Facade,但不知何故,我的原始Facade仍然未受影响,也停止了工作。
另一个相关的奇怪之处是,我试图从头开始为我的Facade重新创建所有必要的文件,它工作得很好,像新的一样。然后我去重命名Facade和相应的类/文件,然后它又崩溃了。
因此,操纵文件夹似乎会破坏一些东西,但这没有意义。我的正面不再工作有什么原因吗?
以下是我的相关文件:
应用程序/服务/BookLookUp.php
<?php
namespace App'Services;
class BookLookUp {
public function test()
{
return "foo";
}
}
应用程序/外观/BookLookUp.php
<?php
namespace App'Facades;
use Illuminate'Support'Facades'Facade;
class BookLookUp extends Facade
{
protected static function getFacadeAccessor()
{
return 'BookLookUp';
}
}
应用程序/供应商/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 ['BookLookUp']
,就像register方法返回BookLookUp
一样。
至于为什么在操作文件时发生了变化,这是由于composer
。绑定在调用composer update
时被重置,所以在我操纵任何文件之前,它从未被调用过,并且看起来正在工作。一旦它被调用,它试图注册我现在提供的绑定,除了我在我的方法中有一个错误,就像我之前描述的,所以它永远无法正确定位我的BookLookUp
类。