Laravel 5.1自定义门面停止工作

时间:2015-10-16 07:24:14

标签: php laravel laravel-5 ioc-container laravel-facade

我正在尝试为我的Laravel 5.1.17应用程序制作自定义Facade。我一步一步地关注Laravel documentation以及this tutorial,实际上我可以为自定义服务创建自定义Facade。

然而,突然间它破了。我得到的错误信息是:

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

换句话说,我的Facade没有受到约束,而Laravel正在我的中间test()类中寻找BookLookUp extends Facade方法,而不是我想要的服务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'];
    }
}

应用/ HTTP / routes.php文件

<?php

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

1 个答案:

答案 0 :(得分:1)

问题是我设置protected $defer = true;但我的provides()方法没有返回正确的值;相反,正确的返回值只是return ['BookLookUp'],就像寄存器方法返回BookLookUp一样。

至于为什么在操作文件时出现了变化,这是由于composer。调用composer update时重置绑定,所以在我操作任何从未调用过的文件之前就已经开始工作了。一旦它被调用它尝试注册我现在提供的绑定,除了我在我的方法中有一个错误,就像我之前描述的那样,所以它永远无法正确定位我的BookLookUp类。