Laravel: проблема с вызовом пользовательского фасада

Я использую Laravel 8 и создаю собственный фасад, но не могу вспомнить его с LogActivity::log($payload), а только с LogActivityFacade::log($payload).

Не вижу, в чем моя вина ...

приложение \ Helpers \ LogActivityFacade.php

<?php


namespace App\Helpers;


use Illuminate\Support\Facades\Facade;

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

приложение \ Helpers \ LogActivityHelper.php

<?php


namespace App\Helpers;


use App\Repositories\LogActivityRepository;

class LogActivityHelper
{
    public function log($payload)
    {
        $repository = new LogActivityRepository();
        $repository->store($payload);
    }
}

приложение \ Providers \ LogActivityServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\Facades\App;
use App\Helpers\LogActivityHelper;
use Illuminate\Support\ServiceProvider;

class LogActivityServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('logactivity', function() {
            return new LogActivityHelper();
        });
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

config / app.php

В массиве провайдеров

[...]
App\Providers\LogActivityServiceProvider::class,

В массиве псевдонимов

'LogActivity' => App\Helpers\LogActivityFacade::class,

Я пробовал также composer dump-autoload и php artisan config:clear, но я могу получить доступ к фасаду (и он работает ...) только с LogActivityFacade::log() вместо LogActivity.


person bordevel    schedule 28.10.2020    source источник


Ответы (2)


Это ожидаемое поведение. Laravel не создает для вас новые классы, а просто передает методы из класса службы в фасаде с помощью магического метода __call. Если вы взглянете, например, на фасад Auth или Route в каталоге vendor, вы увидите, что они названы Auth и Route соответственно, а не AuthFacade и RouteFacade. Так что просто назовите свой фасад LogActivity. Если вам нужно отличить его от класса обслуживания, вы можете использовать пространство имен или просто добавить к имени класса обслуживания постфикс, как вы уже сделали.

person kaan_a    schedule 28.10.2020

Это можно сделать для облегчения доступа к фасадам

namespace App\Facade;

use Illuminate\Support\Facades\Facade;

abstract  class BaseFacade extends Facade
{

    /**
     * @return string
     */
    public static function getFacadeAccessor()
    {
        return static::class ;
    }

    /**
     * @param $class
     */
    static function shouldProxyTo($class)
    {
        app()->singleton(self::getFacadeAccessor(),$class);
    }

}

расширить другие фасады

namespace App\Facade\Plugins;


use App\Facade\BaseFacade;

/**
 * @method static convertPersianNumberToEnglish($number)
 * @method static bool checkDataIsTrue(array  $results = [])
 * @method static string|null removeFileTypeName(string $string = null)
 */
class GlobalPluginsFacade extends BaseFacade
{

}

зарегистрируйтесь у поставщика услуг

public function boot()
{

  // global facades
  GlobalPluginsFacade::shouldProxyTo(GlobalPluginsRepo::class);

}

И проста в использовании.

GlobalPluginsFacade::getFunction();
person Akbar Rahmanii    schedule 28.10.2020