2015-10-16 2 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 ищет метод test() в моем посреднической BookLookUp extends Facade класса, а не моей предполагаемой службы BookLookUp класса.

Очень странно, что он работал отлично, а затем он просто прекратил работать. То, что я сделал, которое, похоже, заставило его сломаться, я попытался добавить еще один Фасад, дублируя мои соответствующие файлы и просто меняя имена, но каким-то образом мой оригинальный Фасад, который остался нетронутым, также переставал работать.

Другая связанная странность была я пытался воссоздать с нуля все необходимые файлы для моего фасада, и это сработало, как новое. Затем я пошел и переименовал Фасад и соответствующие классы/файлы, и он снова сломался.

Таким образом, кажется, что манипулирование папкой так или иначе разрушает вещи, но это не имеет смысла. Есть ли причина, по которой мои Фасады больше не работают?

Ниже приведены мои соответствующие файлы:

App/Услуги/BookLookUp.php

<?php 

namespace App\Services; 

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

App/Фасады/BookLookUp.php

<?php 

namespace App\Facades; 

use Illuminate\Support\Facades\Facade; 

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

App/Провайдеры/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(); 
}); 

ответ

1

Проблема заключалась в том, что я установил protected $defer = true; но мой provides() метод не возвращал правильное значение; Вместо этого правильное возвращаемое значение будет просто return ['BookLookUp'], так же как метод register возвращает BookLookUp.

Что касается того, что изменилось при манипулировании файлами, это связано с composer. Привязывание сбрасывается при вызове composer update, поэтому, прежде чем я манипулировал любыми файлами, он никогда не вызывался и, казалось, работал. Как только он был вызван, он попытался зарегистрировать привязки, которые я теперь предоставил, за исключением того, что у меня была ошибка в моем методе, как я описал ранее, поэтому он никогда не смог правильно найти мой класс BookLookUp.

+0

ИМЕЕТ ТОЧНУЮ ТОЧНУЮ проблему. Фасад работал правильно в Тинкере, но я не мог понять всю жизнь, почему это было не тогда, когда я позвонил в php-файл (например, контроллер). Спасибо за этот пост! – edc598