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