Laravel:调用自定义Facade的问题



我使用的是Laravel 8,我正在创建一个自定义的Facade,但我无法用LogActivity::log($payload)回忆它,只能用LogActivityFacade::log($payload)回忆它。

看不出哪里是我的错。。。

app\Helpers\LogActivityFacade.php

<?php

namespace AppHelpers;

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

app\Helpers\LogActivityHelper.php

<?php

namespace AppHelpers;

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

app\Providers\LogActivityServiceProvider.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-autoloadphp artisan config:clear,但我只能使用LogActivityFacade::log()而不是LogActivity访问Facade(而且它…(。

这是预期的行为。Laravel不会为您创建新的类,它只是使用__call魔术方法代理facade中服务类的方法。例如,如果您查看供应商目录中的AuthRoute立面,您会发现它们分别命名为AuthRoute,而不是AuthFacadeRouteFacade。所以只需将你的门面命名为LogActivity。如果您需要将其与服务类区分开来,您可以使用名称空间设置,也可以像您已经做过的那样将服务类名后缀。

您可以这样做以方便访问立面

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();

最新更新