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

#laravel #laravel-8

#laravel #laravel-8

Вопрос:

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

Не вижу, в чем моя ошибка…

appHelpersLogActivityFacade.php

 <?php


namespace AppHelpers;


use IlluminateSupportFacadesFacade;

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

appHelpersLogActivityHelper.php

 <?php


namespace AppHelpers;


use AppRepositoriesLogActivityRepository;

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

appProvidersLogActivityServiceProvider.php

 <?php

namespace AppProviders;

use IlluminateSupportFacadesApp;
use AppHelpersLogActivityHelper;
use IlluminateSupportServiceProvider;

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

В массиве поставщиков

 [...]
AppProvidersLogActivityServiceProvider::class,

  

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

 'LogActivity' => AppHelpersLogActivityFacade::class,
  

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

Ответ №1:

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

Ответ №2:

Вы можете сделать это для легкого доступа к фасадам

 namespace AppFacade;

use IlluminateSupportFacadesFacade;

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 AppFacadePlugins;


use AppFacadeBaseFacade;

/**
 * @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();