2015-10-16 61 views
1

我正在爲我的Laravel 5.1.17應用程序製作自定義外觀。我一直按照Laravel documentation以及this tutorial的步驟行事,事實上我能夠爲我的定製服務創建自定義外觀。Laravel 5.1自定義門面停止工作

然而,它突然間破裂了。該錯誤消息我得到的是:

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

換句話說,我的門面是沒有得到約束,而是Laravel是我的中介BookLookUp extends Facade類,而不是我的目的服務BookLookUp類中尋找test()方法。

很奇怪的是,它工作得很好,然後它就停止工作。我所做的似乎已經讓它突破了,我試圖通過複製我的相關文件並轉換名稱來添加另一個Facade,但不知何故,我的原始Facade仍未改變,停止工作。

另一個相關的奇怪之處是我試圖從頭開始重新創建我的Facade的所有必需的文件,它的工作原理很新。然後我去了,重新命名了Facade和相應的類/文件,並重新打開了它。

因此,似乎操縱該文件夾以某種方式破壞的東西,但這沒有任何意義。有沒有理由我的Facades不再工作?

以下是我的相關文件:

應用程序/服務/ 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'; 
    } 
} 

應用/ 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']; 
    } 
} 

應用程序/ HTTP/routes.php文件

<?php 

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

回答

1

的問題是,我設置protected $defer = true;但我provides()方法不返回正確的值;相反,正確的返回值僅僅是return ['BookLookUp'],就像寄存器方法返回BookLookUp一樣。

至於爲什麼在操作文件時發生了改變,這是由於composer。在調用composer update時綁定被重置,所以在我操縱任何它從未被調用過的文件並且似乎正在工作之前。一旦它被調用,它試圖註冊我現在提供的綁定,除了我的方法中有一個錯誤,就像我之前描述的那樣,所以它永遠無法正確地找到我的BookLookUp類。

+0

有相同的確切問題。門面在Tinker中正常工作,但是我無法弄清楚爲什麼當我在一個php文件中調用(比如說一個控制器)時,我不知道爲什麼。感謝這篇文章! – edc598