Laravel 5.2 Что происходит в фасаде getFacadeAccessor return

Поэтому я пытаюсь создать своего первого поставщика услуг и бесплатный фасад в Laravel.

Поставщик услуг:

<?php namespace Jbm\Providers;

use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider as BaseServiceProvider;

use Jbm\Helpers\ReportGenerator;

class ReportGeneratorServiceProvider extends BaseServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('Jbm\Helpers\Contracts\ReportGeneratorContract', function($app){
            return new ReportGenerator();
        });
    }

    /**
     * Add the Cors middleware to the router.
     *
     * @param Kernel $kernel
     */
    public function boot(Request $request, Kernel $kernel)
    {
        //
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return array('jbm.reportGenerator');
    }

}

Фасад:

<?php

namespace Jbm\Facades;

use Illuminate\Support\Facades\Facade;

class ReportGenerator extends Facade 
{
    protected static function getFacadeAccessor() 
    { 
        return 'jbm.reportGenerator'; 
    }
}

Кажется, что каждый пакет, на который я смотрю, обрабатывает вещи по-разному. Одна вещь, которая меня смущает, это то, что должно идти в возврате getFacadeAccessor() в Фасаде. В своем поставщике услуг я говорю, что он предоставляет jbm.reportGenerator, а затем использует его в Фасаде, но я не знаю, как это связано с тем, что я зарегистрировал. Любая помощь будет принята с благодарностью.

Обновление:

Я решил добавить своего поставщика услуг и свой фасад в свой config/app.php, а затем попытался использовать его в контроллере, и он говорит: «Генератор отчетов не найден». Так что это явно не работает... не знаю, почему

Обновление 2:

После удаления точки в имени я теперь получаю Call to undefined method Jbm\Facades\ReportGenerator::parseConfig().


person Bill Garrison    schedule 05.03.2016    source источник
comment
Можете ли вы попробовать переименовать jbm.reportGenerator просто в reportGenerator? Я не уверен, что вы можете использовать такую ​​точку   -  person Denis Mysenko    schedule 05.03.2016


Ответы (2)


Во-первых, ваш поставщик услуг должен находиться в пространстве имен App\Providers и должен расширять ServiceProvider. Так это будет выглядеть так:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Jbm\Helpers\ReportGenerator;

class ReportGeneratorServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind('Jbm\Helpers\Contracts\ReportGeneratorContract', function($app){
            return new ReportGenerator();
        });
    }    
}

После этого фасад должен оказаться в пространстве имен App\Facades, а метод getFacadeAccessor() должен вернуть имя класса вашего сервис-провайдера:

<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class ReportGenerator extends Facade 
{
    protected static function getFacadeAccessor() 
    { 
        return App\Providers\ReportGeneratorServiceProvider::class;
    }
}

Теперь давайте добавим поставщика услуг и фасад в приложение:

// config/app.php

'providers' => [
    App\Providers\ReportGeneratorServiceProvider::class,
]

'aliases' => [
    'ReportGenerator' => App\Facades\ReportGenerator::class,
]
person dotancohen    schedule 19.02.2019

getFacadeAccessor должен возвращать строку, о которой «знает» ваш контейнер. Это означает что-то, что зарегистрировано через провайдера.

Вы добавляете свой фасад и псевдоним в app.php, чтобы иметь доступ к тому, что вы зарегистрировали статически.

Поэтому, когда вы вызываете YourFacadeAlias::doSomething();, laravel обнаруживает YourFacaseAlias, видит, что возвращается от getFacadeAccessor, и использует этот результат для возврата объекта, связанного с ним, из контейнера.

Поскольку и ваш фасад, и помощник называются «ReportGenerator», проблема может быть связана с ними обоими. Но я думаю, что вы должны сначала проверить свой app.php, чтобы увидеть, правильно ли вы его установили. Затем убедитесь, что ваши getFacadeAccessor и связанные значения совпадают.

person MaGnetas    schedule 05.03.2016
comment
За исключением того, что я думал, что делаю. У меня есть поставщик услуг, который предоставляет «reportGenerator» (удалил точку в соответствии с запросом @DenisMysenko), и getFacadeAccessor возвращает ту же строку. Все равно не щелкает..... - person Bill Garrison; 07.03.2016