【问题标题】:Laravel 5.1 Custom Facade Stopped WorkingLaravel 5.1 自定义外观停止工作
【发布时间】:2016-01-14 20:48:15
【问题描述】:

我正在尝试为我的 Laravel 5.1.17 应用程序制作自定义外观。我一步一步地遵循了Laravel documentationthis tutorial,确实我能够为我的自定义服务创建一个自定义外观。

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

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 和相应的类/文件,结果它又坏了。

因此,操作文件夹似乎会以某种方式破坏事情,但这没有任何意义。我的 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();
});

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 遇到了同样的问题。门面在 Tinker 中正常工作,但我一生都无法弄清楚为什么在我在 php 文件中调用(比如控制器)时它不是。感谢这篇文章!
    猜你喜欢
    • 2019-02-19
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多