我使用的是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-autoload
和php artisan config:clear
,但我只能使用LogActivityFacade::log()
而不是LogActivity
访问Facade(而且它…(。
这是预期的行为。Laravel不会为您创建新的类,它只是使用__call
魔术方法代理facade中服务类的方法。例如,如果您查看供应商目录中的Auth
或Route
立面,您会发现它们分别命名为Auth
和Route
,而不是AuthFacade
和RouteFacade
。所以只需将你的门面命名为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();